Lituo-139 単語分割
1. トピック
文字列sと文字列wordDictのリストを辞書として指定します。辞書に載っている単語の中からsをつなげられるかどうかを判断してください。
注: 辞書にあるすべての単語を使用する必要はなく、辞書にある単語は繰り返し使用できます。
例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
2. 分析
- この問題を最初に見ると、最初に思い浮かぶのはバックトラッキングですが、Donggui がここ数日間トレーニングを行ってきたことから、これは再利用できるため、完全なナップザック問題であることもわかります。
- dp[i] は、長さが i のとき、0-i の区間でインターセプトされた文字列が wordDict 文字列構成を満たしているかどうか、それが形成されている場合は値が true、そうでない場合は false であることを意味します。
- 第二に、この構成は単語の列であるため順序があり、その配置が採用されます。つまり、外側のループ i はバックパックの容量、つまり s 文字列の長さ、内側のループ j は、 j<iの場合、つまりji Stringの区間を構成する文字がwordDict内に存在するかどうかの判定を完了でき、存在すればdp[i]=true、存在しなければdp[i]=trueとなります。偽のままです。このように、存在するかどうかを判断すると、先ほどの dp[j] が true であるかどうかを確認することができ、true であれば、直前に wordDict の文字列が置かれ、末尾が j で添字されているということになります。新しい wordDict 内に完全な文字列を入力します。
- ここではhashset を使用して wordDict 値を保存することも、ループ中にそれをインターセプトすることもできます。
- コードを書きます。
3. コードとコメント
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
// 1.完全背包,判断情况:排列
// 2.dp[i]表示到i下标前能够添加成功wordDict字符串,为true
boolean[] dp = new boolean[s.length() + 1];
Set<String> set = new HashSet<>(wordDict);
dp[0] = true;
for (int i = 1; i <= s.length(); i++){
for (int j = 0; j < i; j++){
// 3.wordDict是否存在,是否在前面j的时候是放入完整的一个字符串
if (set.contains(s.substring(j, i)) && dp[j]){
dp[i] = true;
}
}
}
return dp[s.length()];
}
}
4. 練習する
Leetcode トピックのリンク: https://leetcode.cn/problems/word-break/