Leetcode139。単語分割
問題の説明
空ではない文字列sと空ではない単語のリストを含む辞書wordDictを指定して、sをスペースで辞書に表示される1つ以上の単語に分割できるかどうかを決定します。
説明:
- 分割するときに、辞書内の単語を再利用できます。
- 辞書に重複する単語がないと想定できます。
入力:s = "leetcode", wordDict = ["leet", "code"]
出力:true
問題解決レポート
dp[i]
文字列s
の0
最初の文字から最初の文字までをi
分割できるかどうかを示します。
決定するdp[i]
から分割するかどうか、逆探索がある場合、それは分割して最初にすることができます最初の文字ジェーン組成物は辞書で見つけることができます文字の文字。i-1
0
dp[j]
j
i
実装コード
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-1
0
dp[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];
}
};