動的計画法に関する問題を読んでいます。問題は次のとおりです。
長さnの文字列を有効な単語のシーケンスに分割します。文字列が一定時間内に有効な単語であるかどうかを示すデータ構造があると想定します。
私はそれを私の方法で解決しましたが、私が読んだ解決策は次のとおりでした:
サブストリング[0...i]を有効な単語のシーケンスに分割できる場合、T[i]が真であることを示すテーブルT[N]を作成します。T [i]は、aj、0 <= j <= k-1が存在する場合に真になります。ここで、T [j]は真であり、S(j、k)は有効な単語です。
これはDPの古典的な定式化ですが、間違っていませんか?すべきではありません:
T [i]は、aj、0 <= j <= k-1が存在する場合に真になります。ここで、T [j]は真であり、S(j + 1、k)は有効な単語であるか、S(0、i)は有効です。単語?
そうでなければ、たとえば文字列の場合、テーブルがどのように構築される かわかりitsthe
ません。それが単語であり、次のシーケンスがj = 2の場合
をT[2] = true
考慮しないと、テーブルが作成されません。ここ?しかし、どうすれば実際の単語を見つけることができますか?
私が理解するために作成したサンプルコード(Java のサブストリングを返します):its
the
S(2+1, N)
s.substring(i,j)
i including j-1
int i = 0
for(; i < s.length(); i++){
for(int j = 0; j > i; j++){
if(T[j] && dictionary.contains(s.substring(j + 1, i)){
T[i] = true;
break;
}
}
if(dictionary.contains(s.substring(0, i + 1)){
T[i] = true;
}
}