LeetCode特集TOPインタビューの質問(Java実装) - 単語分割

一つ、タイトル説明

1.1トピック
  • スプリットの言葉

  • 文字列s空でないと単語リストを含む非空の辞書wordDictを考えると、1つ以上の単語が辞書に表示されるに空間Sが分割できるかどうか判断されます。

  • 注:
    あなたが分割しばらく辞書に単語を再利用することができます。
    あなたは辞書に単語のない繰り返しが存在しないと仮定することができます。

  • 例1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"
  • 例2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"
     注意你可以重复使用字典中的单词。
  • 例3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
1.2知識ポイント
  • ダイナミックプログラミング
1.3トピックのリンク

第二に、問題解決のためのアイデア

2.1問題解決のアイデア

  動的プログラミングと同様01ナップザック問題、すなわち、全体的な単語を分割する際ワード長電流N場合、唯一のワードをm(0〜M)、およびm〜nは、缶の構成されているか否かのワード長を決定する場合で、そのために再帰式を要約する単語を形成します:

  • DP [I] = DP [J] && wordDict.contains(s.substring(j、i)に対して)
2.2関連トピック

第三に、実装コード

3.1コードの実装
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        boolean[] dp = new boolean[s.length()+1];
        dp[0] = true;
        for(int i = 1; i <= s.length(); i++){
            for(int j = 0; j < i; j++){
                if(dp[j] && wordDict.contains(s.substring(j, i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
    }
}
公開された277元の記事 ウォン称賛33 ビュー40000 +

おすすめ

転載: blog.csdn.net/qq_40697071/article/details/104066288