JavaScriptで2つ目の文字列が1つ目の文字列の回転かどうかを判定する方法
今回は、2つの文字列(str1 と str2)を受け取り、2つ目の文字列が1つ目の文字列を回転(ローテート)させたものかどうかを判定するJavaScript関数を作成します。
問題の概要
たとえば、入力として次のような文字列が与えられたとします。
const str1 = 'abcde'; const str2 = 'cdeab';
この場合の出力は true になります。なぜなら、str2 は str1 の先頭にある「ab」を文字列の末尾に移動させることで作れるからです。つまり「abcde」を回転すると「cdeab」になるため、2つ目の文字列は1つ目の文字列の回転版であると言えます。
実装の考え方
判定は以下の手順で行います。
- まず、両者の文字列の長さが異なる場合は false を返します(長さが同じでなければ回転版になり得ないため)。
- 両方の文字列が空の場合は true を返します。
- その後、0 から文字列の長さまでの各位置について
slice()とconcat()を使って回転後の文字列を生成し、str2 と一致するかどうかを順に比較します。
サンプルコード
const str1 = 'abcde';
const str2 = 'cdeab';
const isRotated = (str1, str2) => {
// 長さが異なる場合は回転版ではない
if(str1.length !== str2.length){
return false;
};
// どちらも空文字列の場合は true
if( (str1.length || str2.length) === 0){
return true;
};
// 各回転位置で文字列を組み替えて比較
for(let i = 0; i < str1.length; i++){
const reversed = str1.slice(i).concat(str1.slice(0, i));
if(reversed === str2){
return true;
};
}
return false;
};
console.log(isRotated(str1, str2));実行結果
このコードをコンソールで実行すると、次のように出力されます。
true
補足:より簡潔な実装方法
なお、同様の判定は (str1 + str1).includes(str2) を使うことで、ループなしの1行でも実現できます。str1 を2回連結した文字列には、str1 のあらゆる回転パターンが必ず含まれるという性質を利用した、定番のテクニックです。可読性やパフォーマンスの観点から、こちらの方法を採用するのも有効でしょう。
-
JavaScriptで文字列の重みを計算する方法
アルファベット1文字の「重み」とは?英語のアルファベットにおける「重み」とは、その文字がアルファベットの中で何番目に位置するかを示す、1から始まるインデックスのことです。たとえば、「c」は3番目なので重みは3、「k」は11番目なので重みは11となります。この記事では、小文字の文字列を受け取り、その文字列全体の重みを計算して返すJavaScript関数を作成します。実装例実際のコードは以下のとおりです。const str = this is a string; { str = str.toLowerCase(); &
-
JavaScriptで特定の文字列の順序に従って文字列を並べ替える方法
問題 2つの文字列 str1 と str2 を第1・第2引数として受け取るJavaScript関数を作成する必要があります。 この関数は、str1 を str2 に含まれる文字の出現順序に従って並べ替えます。 例えば、関数への入力が以下の場合を考えてみましょう。 入力 const str1 = coding; const str2 = gncabdi; 出力 const output = gncdio; 出力の説明 str2 の中で先に現れる文字が優先的に前に配置され、その後に後から現れる文字が続きます。そして最後に、str2 に存在しない残りの文字がそのまま並べられます。 解決のアプローチ