题目链接
求解思路
跟昨天做的两道很像
把字符串s看作总金额amount,把词典看作不同的硬币面额coins
存储: dp[i]表示0到i-1的字符串能不能被字典表示
初始化: dp[0]表示字符串为空时,为true
状态转移: dp[i]由以下步骤得到:
- 遍历词典中的单词,用wj表示
- 如果s(0,i-1)是以单词wj结尾的,dp[i] = dp[i-wj的长度]
- 如果dp[i]=true,结束遍历
代码
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int len = s.length();
bool dp[len+1];
dp[0] = true; //初始化
for(int i=1;i<=len;i++){
for(int j=0;j<wordDict.size();j++){
if(i<wordDict[j].length()){ //子字符串长度还没有单词长,肯定不是以单词wordDict[j]结尾的
dp[i] = false;
}
else if(s.substr(i-wordDict[j].length(),wordDict[j].length())==wordDict[j]){//判断是不是以单词wordDict[j]结尾的
dp[i] = dp[i-wordDict[j].length()];
}else{
dp[i] = false;
}
if(dp[i]==true) break; //为true,结束遍历
}
}
return dp[len];
}
};