Leetcode 139.单词拆分
问题描述
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
输入: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] 题解区 bonheur
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];
}
};