JavaScriptで文字列を単語に分割できるか判定する方法
空でない文字列 str と、空でない単語のリストを格納した文字列の配列 arr が与えられます。
ここで求められているのは、str を、配列に存在する1つ以上の単語をスペースで区切った並びに分割できるかどうかを判定する関数を作成することです。
注意点
配列内の同じ単語は、分割の際に何度でも再利用して構いません。
配列には重複した単語は含まれていません。
例1
入力が次の場合を考えてみましょう。
const str = "applepenapple"; const arr = ["apple", "pen"];
このときの出力は true になります。その理由は以下の通りです。
"applepenapple" は "apple pen apple" と分割できます。
コード例
この問題を解くコードは以下のようになります。
const str = "applepenapple";
const arr = ["apple", "pen"];
const wordSequence = (str = '', arr = []) => {
const map = {}
function helper(str) {
if (map.hasOwnProperty(str)) {
return map[str]
} else if (str=='') {
return true
}
for (let i=0;i<=str.length;i++) {
if (
arr.includes(str.slice(i)) &&
helper(str.slice(0, i))
){
map[str] = true
return true
}
};
map[str] = false;
return false;
};
return helper(str)
};
console.log(wordSequence(str, arr));出力
コンソールには次のように出力されます。
true
コードの解説
この実装では、再帰とメモ化(キャッシュ)を組み合わせたアプローチを採用しています。
ヘルパー関数 helper は、文字列の各位置で分割を試みます。具体的には、後半部分(str.slice(i))が配列に含まれる単語と一致し、かつ前半部分(str.slice(0, i))も同様に分割可能であるかを再帰的に確認します。
オブジェクト map を使って一度計算した結果をキャッシュすることで、同じ部分文字列に対する重複した計算を回避し、処理効率を大幅に向上させています。また、空文字列に到達した場合は、すべての部分が配列内の単語へと分割できたことを意味するため、true を返します。
このように、動的計画法の考え方を取り入れることで、単純な全探索よりもはるかに高速に判定を行うことができます。
-
JavaScriptで不正な時間文字列(HH:MM:SS)を正規化して修正する方法
JavaScriptでは、「HH:MM:SS」形式の時間文字列を扱う場面がよくあります。しかし、時間の加算処理などで計算ミスが発生すると、分や秒が60を超えてしまう「壊れた」時間文字列が生成されることがあります。この記事では、そうした不正な時間文字列を正しく正規化する方法を解説します。 課題:壊れた時間文字列とは 今回求められるのは、JavaScriptで「HH:MM:SS」形式の時間文字列を受け取り、必要な修正を加えた上で、正しい時間文字列として返す関数を作成することです。 問題になるのは、加算処理のバグによって、次のような不正な値が含まれてしまうケースです。 MM(分)の部分が60を超え
-
JavaScriptでスペースの位置を維持したまま文字列を反転させる方法
問題空白(スペース)を含む可能性のある文字列を受け取り、各単語の文字順だけを反転させるJavaScript関数を作成することを考えます。求められる条件は次のとおりです。単語内部の文字は逆順に並べ替える単語と単語を区切るスペースの位置は元のまま維持する異なる単語の文字同士が入れ替わらないようにするアプローチ基本となるアイデアは、「元の文字列を末尾から先頭へ向かって走査し、空白以外の文字を結果用の文字列へ追加していく」というものです。文字を追加するたびに、結果文字列の現在の長さをインデックスとして元の文字列を参照し、その位置がスペースであれば同じくスペースを結果に加えます。こうすることで、スペース