JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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 のあらゆる回転パターンが必ず含まれるという性質を利用した、定番のテクニックです。可読性やパフォーマンスの観点から、こちらの方法を採用するのも有効でしょう。

  1. JavaScriptで文字列の重みを計算する方法

    アルファベット1文字の「重み」とは?英語のアルファベットにおける「重み」とは、その文字がアルファベットの中で何番目に位置するかを示す、1から始まるインデックスのことです。たとえば、「c」は3番目なので重みは3、「k」は11番目なので重みは11となります。この記事では、小文字の文字列を受け取り、その文字列全体の重みを計算して返すJavaScript関数を作成します。実装例実際のコードは以下のとおりです。const str = this is a string; {    str = str.toLowerCase();   &

  2. JavaScriptで特定の文字列の順序に従って文字列を並べ替える方法

    問題 2つの文字列 str1 と str2 を第1・第2引数として受け取るJavaScript関数を作成する必要があります。 この関数は、str1 を str2 に含まれる文字の出現順序に従って並べ替えます。 例えば、関数への入力が以下の場合を考えてみましょう。 入力 const str1 = coding; const str2 = gncabdi; 出力 const output = gncdio; 出力の説明 str2 の中で先に現れる文字が優先的に前に配置され、その後に後から現れる文字が続きます。そして最後に、str2 に存在しない残りの文字がそのまま並べられます。 解決のアプローチ