题目描述:
分析:
这道题不怎么会,我想的方法太麻烦,还不对,就不献丑了,直接说看了题解的想法吧。
题解用了dp,dp[i]=true 代表s[0]~s[i+1]这部分子字符串是可以由wordDict中的单词拼接而成的
预先把wordDict中的所有单词存入hash表map
因此,s是否可以由wordDict中的单词组成,可以换个角度思考,如果存在一个点j,使得dp[j]=true,即s[0]~s[j]可以由wordDict中的单词组成。而剩下的s[j]-s[n]组成的单词如果能在hash表map中找到,则s就可以判定为是可以由wordDict中的单词组成的。
用公式表达,就是:dp[j]&&ss.find(s.substr(j,i-j))!=ss.end()
而dp[j]可以使用同样的方法计算得出。
题解链接:
https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-by-leetcode-solution/
代码如下:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
// 定义set集合ss,用来存储worwordDict中的所有单词
set<string> ss;
for(int i=0;i<wordDict.size();i++)
ss.insert(wordDict[i]);
// dp[i]=true 代表s[0]~s[i+1]这部分子字符串是可以由wordDict中的单词拼接而成的
// dp[1]-dp[s.size()]对应s[0]-s[s.size()-1]
bool dp[305];
// 初始化所有dp均为false
for(int i=0;i<300;i++)
dp[i]=false;
// dp[0]初始化为true
dp[0]=true;
// 注意,dp[i]对应s[i-1]
// 遍历s
for(int i=1;i<=s.size();i++)
{
// 依次从0遍历到i-1,来寻找s[0]~s[i-1]之间可能的分割点
for(int j=0;j<i;j++)
{
// 以j为分割点,s的子串划分为s[0]~s[j-1]和s[j]~s[i]
string temp=s.substr(j,i-j);
// 如果s[0]~s[j-1]可以由wordDict中的单词拼接而成
// 而且s[j]~s[i]也对应wordDict中的某个单词
// 则说明s的子串s[0]~s[i] 是可以由wordDict中的单词拼接而成的 将dp[i]记为true
if(dp[j]&&ss.find(s.substr(j,i-j))!=ss.end())
dp[i]=true;
}
}
// 返回结果 dp[s.size()]表示s[0]~s[s.size()-1]是否能由wordDict中的单词拼接而成
return dp[s.size()];
}
};