JavaScriptで文字列の一部を並べ替えて別の文字列を形成できるか判定する方法
問題
2つの文字列 str1 と str2 を引数に受け取るJavaScript関数を作成する必要があります。str1 に含まれる文字の一部を使い、並べ替えることで str2 と一致する文字列を形成できる場合は true を、そうでない場合は false を返すようにします。
たとえば、str1 が "rkqodlw"、str2 が "world" の場合、str1 内に必要な文字がすべて揃っているため、結果は true になります。
解法の考え方
この問題は以下の手順で解くことができます。
- まず、
str1の長さがstr2よりも短い場合は、どんなに並べ替えてもstr2を形成できないため、即座にfalseを返します。 str2を1文字ずつ配列に分解し、「まだ見つかっていない必要な文字」のリストとして管理します。str1の各文字を順に調べ、必要な文字リストに含まれていれば、その文字をリストから削除(消費)します。- 最終的にリストが空になっていれば、
str1の一部の文字だけでstr2を完全に形成できたことになります。
コード例
以下が実際のコードです。
const str1 = 'rkqodlw';
const str2 = 'world';
const canForm = (str1 = '', str2 = '') => {
if(str1.length < str2.length){
return false;
}
const res = str2.split('');
str1.split('').forEach(val => {
if(res.includes(val)){
res.splice(res.indexOf(val), 1);
}
});
return res.length === 0;
};
console.log(canForm(str1, str2));出力
コンソールには以下のように表示されます。
true
処理の流れの解説
このコードでは、str2.split('') によって "world" が ['w', 'o', 'r', 'l', 'd'] という配列に変換されます。その後、str1 の各文字を順番にチェックし、配列内に同じ文字が存在すれば splice() メソッドで取り除いていきます。
すべての処理が完了した時点で res 配列が空(res.length === 0)であれば、str2 のすべての文字が str1 内から見つかったことを意味するため、true を返します。
なお、この実装の計算量は O(n × m)(n は str1 の長さ、m は str2 の長さ)です。パフォーマンスを重視する場合は、両方の文字列の文字出現回数をオブジェクトやMapでカウントして比較する方式に書き換えると、O(n + m) まで高速化できます。
-
【Python】文字列を並べ替えて回文を作れるかどうかを判定する方法
問題の概要 文字列 s が与えられたとき、その文字を並べ替えることで回文(前から読んでも後ろから読んでも同じになる文字列)を作ることができるかどうかを判定します。 例えば、入力が s = raaecrc の場合、これを racecar という回文に並べ替えられるため、出力は True になります。 解決のアプローチ 文字を自由に並べ替えて回文を形成できる条件は、「奇数回出現する文字が最大1種類であること」です。これは次のように考えられます。 文字列の長さが偶数の場合:すべての文字が偶数回出現する必要があります。 文字列の長さが奇数の場合:ちょうど1つの文字だけが奇数回出現し、その文字が中央
-
Pythonで文字列を並べ替えて回文を作成できるかどうかを判定する方法
文字列が与えられたとき、その文字を並べ替えることで回文(前から読んでも後ろから読んでも同じ文字列)を作成できるかどうかを判定する問題について解説します。例えば、入力が s = aarcrce の場合、文字を並べ替えて racecar を作ることができるため、出力は True になります。考え方回文になるための条件はシンプルです。各文字の出現回数に着目すると、以下のようになります。文字列の長さが偶数の場合:すべての文字が偶数回出現する必要があります。文字列の長さが奇数の場合:ちょうど1つの文字だけが奇数回出現し、残りはすべて偶数回出現する必要があります。つまり、「奇数回出現する文字の種類数が1以