给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。
例如:给定s=“nowcode”;
dict=["now", "code"].
返回true,因为"nowcode"可以被分割成"now code".试题链接 : CC12 拆分词句
说一下思路,这里我用的是动态规划.
- 状态定义 : F[n] ----> 表示前n个字符否可以被找到
- 状态方程 : F[n] = (F[0]&[1,n]) | (F[1]&[2,n]) ..... | (F[n-1]&[n,n])
- 初始化 : F[0] = true
下面谈状态方程,很好理解 我们计算前n字符可以被抓到,只需要把原本这n个字符再次进行拆分,这样我们逻辑与上自己就可以了,也就是只要找到一个可以被分割就可以代表前n个字符可以被分割
class Solution
{
public:
bool wordBreak(string s, unordered_set<string> &dict)
{
if (s.empty() || dict.empty())
return true;
std::vector<bool> dp;
dp.resize(s.size() + 1, false);
dp[0] = true; // 初始化
for (size_t i = 1; i <= s.size(); i++)
{
for (int j = 0; j < i; j++)
{
// f(1) -> f(0) [1,1]
// f2 -> f0 1-2 0 1
string str = s.substr(j , i - j);
auto iter = dict.find(str);
if (dp[j] && iter != dict.end())
{
dp[i] = true;
break;
}
}
}
return dp[s.size()];
}
};