Lituo-139 単語分割 (dp)

Lituo-139 単語分割

1. トピック

文字列sと文字列wordDictのリストを辞書として指定します。辞書に載っている単語の中からsをつなげられるかどうかを判断してください。

注: 辞書にあるすべての単語を使用する必要はなく、辞書にある単語は繰り返し使用できます。

例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

2. 分析

  1. この問題を最初に見ると、最初に思い浮かぶのはバックトラッキングですが、Donggui がここ数日間トレーニングを行ってきたことから、これは再利用できるため、完全なナップザック問題であることもわかります
  2. dp[i] は、長さが i のとき、0-i の区間でインターセプトされた文字列が wordDict 文字列構成を満たしているかどうか、それが形成されている場合は値が true、そうでない場合は false であることを意味します。
  3. 第二に、この構成は単語の列であるため順序があり、その配置が採用されます。つまり、外側のループ i はバックパックの容量、つまり s 文字列の長さ、内側のループ j は、 j<iの場合、つまりji Stringの区間を構成する文字がwordDict内に存在するかどうかの判定を完了でき、存在すればdp[i]=true、存在しなければdp[i]=trueとなります。偽のままです。このように、存在するかどうかを判断すると、先ほどの dp[j] が true であるかどうかを確認することができ、true であれば、直前に wordDict の文字列が置かれ、末尾が j で添字されているということになります。新しい wordDict 内に完全な文字列を入力します。
  4. ここではhashset を使用して wordDict 値を保存することも、ループ中にそれをインターセプトすることもできます。
  5. コードを書きます。

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/

おすすめ

転載: blog.csdn.net/qq_51326491/article/details/129320237