Leetcode 139.単語分割&Leetcode 55.ジャンプゲーム[逆順で調査]

Leetcode139。単語分割

問題の説明

空ではない文字列sと空ではない単語のリストを含む辞書wordDictを指定して、sをスペースで辞書に表示される1つ以上の単語に分割できるかどうかを決定します。

説明:

  • 分割するときに、辞書内の単語を再利用できます。
  • 辞書に重複する単語がないと想定できます。

入力:s = "leetcode", wordDict = ["leet", "code"]
出力:true

問題解決レポート

dp[i]文字列s0最初の文字から最初の文字までをi分割できるかどうかを示します

決定するdp[i]から分割するかどうか、逆探索がある場合、それは分割して最初にすることができます最初の文字ジェーン組成物は辞書で見つけることができます文字の文字。i-10dp[j]ji

実装コード

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int n=s.size();
        set<string>setWords;
        for(int i=0;i<wordDict.size();i++){
            setWords.insert(wordDict[i]);
        }
        vector<int>dp(n+1,0);
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=i-1;j>=0;j--){
                if(dp[j]&&setWords.find(s.substr(j,i-j))!=setWords.end()){
                    dp[i]=1;
                    break;
                }
            }
        }
        return dp[n];
    }
};

参考文献

[1] Leetcodeジャンプゲーム
[2] 問題領域のボヌール

Leetcode 55.ジャンプゲーム

問題の説明

負でない整数の配列を指定すると、最初は配列の最初の位置にいます。

配列の各要素は、その位置でジャンプできる最大の長さを表します。

最後の位置に到達できるかどうかを判断します。

問題解決レポート

dp[i]i最初の位置に到達できるかどうかを示します

それが決定された場合dp[i]から到達可能かどうかを逆探索、存在する場合、およびまでそのi-10dp[j]j+num[j]>=i

実装コード

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n=nums.size();
        if(n==1){
            return 1;
        }
        vector<int>dp(n,0);
        dp[0]=1;
        for(int i=0;i<n;i++){
            for(int j=i-1;j>=0;j--){
                if(dp[j]&&j+nums[j]>=i){
                    dp[i]=1;
                    break;
                }
            }
        }
        return dp[n-1];
    }
};

参考文献

[1] Leetcode 55.ジャンプゲーム

MD_
139の元の記事を公開 賞賛8 10,000+ビュー

おすすめ

転載: blog.csdn.net/qq_27690765/article/details/105347058