JavaScriptで2つの文字列から作れる重複なしの最長文字列を求める方法
問題
今回は、「a」から「z」までの英小文字のみを含む2つの文字列 s1 と s2 を引数として受け取る JavaScript の関数を作成します。
この関数が返すべきのは、s1 または s2 に登場する文字をすべて集め、重複を排除したうえで昇順に並べ替えた、可能な限り長い文字列です。各文字は1回だけ出現し、結果は必ずソートされた状態でなければなりません。
たとえば、ある文字が両方の文字列に現れたとしても、結果には1度だけ含める必要があります。
解決のアプローチ
実装の手順は以下の通りです。
1. concat() を使って2つの文字列を連結します。
2. toLowerCase() で全体を小文字に統一し、大文字・小文字の違いによる重複を防ぎます。
3. split('') で1文字ずつ配列に分解します。
4. sort() で配列をアルファベット順に並べ替えます。
5. ループ処理の中で includes() を使って重複をチェックしながら、未登録の文字だけを結果配列に追加します。
6. 最後に join('') で配列を結合して文字列として返します。
コード例
以下が実際のコードです。
const str1 = "xyaabbbccccdefww";
const str2 = "xxxxyyyyabklmopq";
const longestPossible = (str1 = '', str2 = '') => {
const combined = str1.concat(str2);
const lower = combined.toLowerCase();
const split = lower.split('');
const sorted = split.sort();
const res = [];
for(const el of sorted){
if(!res.includes(el)){
res.push(el)
}
}
return (res.join(''));
};
console.log(longestPossible(str1, str2));出力結果
コンソールには次のように表示されます。
abcdefklmopqwxy
補足:Set を使ったより簡潔な書き方
ES6 以降では、Set オブジェクトを利用すると重複排除をより簡潔に記述できます。
const longestPossible = (str1 = '', str2 = '') => {
return [...new Set((str1 + str2).toLowerCase())].sort().join('');
};
console.log(longestPossible(str1, str2)); // abcdefklmopqwxyどちらのコードでも同じ結果が得られますが、Set を使った方法はコードが短く読みやすいため、実務ではこちらが好まれることが多いです。
-
JavaScriptで文字列から指定した長さより長い単語を抽出して配列として返す方法
問題 単語の並んだ文(文字列)と数値を受け取り、その数値で指定された長さよりも文字数が多い単語をすべて抽出し、配列として返すJavaScript関数を作成する必要があります。 入力 const str = this is an example of a basic sentence; const num = 4; 出力 const output = [ example, basic, sentence ]; これは、元の文の中で文字数が4より大きい単語が「example」「basic」「sentence」の3つしか存在しないためです。 実装例 以下がそのコードです。 const str =
-
【JavaScript】配列内の連続するn個の文字列を結合して最長の文字列を求める方法
問題概要 文字列の配列と整数 n を受け取り、配列内の「連続する n 個の文字列」をすべて組み合わせて結合した文字列の中から、最も長いものを返す JavaScript 関数を作成します。同じ長さの候補が複数存在する場合は、最初に出現したものを返すのがポイントです。 実装のポイント 入力チェック: 配列が空である、n が配列の長さを超えている、または n が 0 以下の場合は空文字列 を返します。 部分配列の抽出: Array.prototype.slice(i, i + k) を使って、各位置から連続する k 個の要素を取り出します。 結合と比較: join() で結合した文字列の長さを