1、递归+备忘录
class Solution {
string s;
vector<string> wordDict;
unordered_set<string>m_set;
vector<int>memo;//memo[i]表示[i, size()-1]可不可拆分若干个单词连着 1可 0不可 -1不知道
int dfs(int start)
{
if(start == s.size())
{
return 1;
}
if(memo[start] != -1)
{
return memo[start];
}
for(int end = s.size(); end > start; end--)
{//官方写的是这样for(int end = start; end <= s.size(); end++)
string temp = s.substr(start,end - start);
if(m_set.count(temp)==1 && dfs(end) == 1)
{
return memo[start] = 1;
}
}
return memo[start] = 0;
}
public:
bool wordBreak(string s, vector<string>& wordDict) {
this->s = s;
this->wordDict = wordDict;
this->memo = vector<int>(s.size(), -1); //-1表示没有访问过
m_set = unordered_set<string>(wordDict.begin(), wordDict.end());
return dfs(0) == 1;
}
};
2、BFS:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string>m_set(wordDict.begin(), wordDict.end());
queue<int>q;
vector<bool>visited(s.size(), false);
q.push(0);
while(!q.empty())
{
int start = q.front();
q.pop();
if(visited[start] == false)
{
for(int end = s.size(); end > start; end--)
{//官方写是这样for(int end = start; end <= s.size(); end++)
if(m_set.count(s.substr(start, end - start)) == 1)
{
q.push(end);
if(end == s.size())
{
return true;
}
}
}
visited[start] = true;
}
}
return false;
}
};
动态规划:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string>m_set(wordDict.begin(), wordDict.end());
vector<bool>dp(s.size()+1, false);//dp[i]表示s中以i-1结尾能否被拆分
dp[0] = true;
for(int i = 1; i <= s.size(); i++)
{
for(int j = 0; j < i; j++)
{
if(dp[j] && m_set.count(s.substr(j, i - j)) == 1)
{
dp[i] = true;
break;
}
}
}
return dp[s.size()];
}
};
动态规划优化:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string>m_set(wordDict.begin(), wordDict.end());
vector<bool>dp(s.size()+1, false);//dp[i]表示s中[i,size()-1]能否被拆分
dp[s.size()] = true;
for(int i = s.size(); i >= 1; i--)
{
if(dp[i] == true)
{
for(int j = 0; j < i; j++)
{
if(m_set.count(s.substr(j, i - j)) == 1)
{
dp[j] = true;
}
}
}
}
return dp[0];
}
};
参考:
https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-by-leetcode/