JavaScriptで2つの文字列の最大公約数(GCD)を求める方法
数学における最大公約数(GCD:Greatest Common Divisor)とは、2つの整数をどちらも割り切る最大の数のことです。この概念を文字列に応用すると、2つの文字列のGCDは、両方の文字列を構成できる最長の部分文字列(共通パターン)を意味します。
具体例
例えば、次の2つの文字列があるとします。
const str1 = 'abcabc'; const str2 = 'abc';
この場合、「abcabc」は「abc」を2回繰り返した文字列なので、2つの文字列のGCDは以下のようになります。
const gcd = 'abc';
ここでは、2つの文字列 str1 と str2 を引数として受け取り、それらのGCDを計算して返すJavaScript関数を実装します。
実装コード
const str1 = 'abcabc';
const str2 = 'abc';
const findGCD = (str1 = '', str2 = '') => {
if (str1 + str2 !== str2 + str1){
// 共通のパターンが存在しない場合
return "";
} else if (str1 == str2){
return str1;
} else if (str1.length > str2.length){
return findGCD(str1.slice(str2.length), str2);
} else {
return findGCD(str2.slice(str1.length), str1);
}
};
console.log(findGCD(str1, str2));実行結果
コンソールには次のように出力されます。
abc
仕組みの解説
このアルゴリズムは、整数の最大公約数を求める際に使われるユークリッドの互除法と同じ発想を文字列に適用したものです。処理の流れは以下の通りです。
- 結合チェック:
str1 + str2 !== str2 + str1の場合、2つの文字列に共通する繰り返しパターンは存在しないため、空文字列を返します。これは共通パターンの有無を判定する重要な条件です。 - 等しい場合: 2つの文字列が完全に一致していれば、その文字列自体がGCDとなります。
- 再帰的な削減: 長さが異なる場合は、長い方の文字列の先頭から短い方と同じ長さの部分を切り取り、残りの文字列で関数を再帰的に呼び出します。これを繰り返すことで、最終的に共通のパターンが導き出されます。
この手法を使えば、コードはシンプルなまま、どのような文字列の組み合わせでも正しくGCDを求めることができます。
-
JavaScriptで2つの文字列に共通しない文字を抽出して返す方法
問題2つの文字列を引数として受け取るJavaScript関数を作成することを考えます。この関数は、両方の文字列に共通して含まれていない文字、つまりどちらか一方の文字列にのみ存在する文字だけを抜き出し、それらをつなげた新しい文字列を返す必要があります。たとえば、xyab と xzca の2つの文字列が与えられた場合、共通する文字は x と a なので、結果として y、b、z、c を連結した ybzc を返すことになります。コード例以下がその実装コードです。const str1 = xyab; const str2 = xzca; const findUncommon = (str1 = , s
-
C#で一時変数を使わずに2つの文字列を入れ替える方法
C#プログラミングにおいて、通常は一時変数(テンポラリ変数)を使って2つの文字列の値を入れ替えますが、実は一時変数なしでも文字列の連結とSubstringメソッドを組み合わせることで、同じことが実現できます。この記事では、その具体的な手順とサンプルコードをわかりやすく解説します。基本的な考え方一時変数を使用せずに2つの文字列を入れ替えるには、以下の手順に従います。ステップ1:2番目の文字列を1番目の文字列に連結するまず、str2をstr1に連結して、両方の文字列を含む1つの文字列を作成します。str1 = str1 + str2;ステップ2:str1の元の部分をstr2に設定するSubstri