LINTCODE——单词切分
思路:本来是用回溯的,结果严重超时,然后改成动态规划,解决了,这里需要说明的有两点,
第一点:在动态规划计算的时候,采用从i到0的顺序进行计算,这样会优化一点,然后如果得到mark[i]为TRUE(即前i个字符串可以分割的话),直接break,进行下一次循环;
第二点:最好在每次新加入s[i]的时候去字典里面查找,确定s[i]是否存在dict中,如果不存在,那就不用找了,直接退出(false);
class Solution {
public:
/*
* @param s: A string
* @param dict: A dictionary of words dict
* @return: A boolean
*/
bool wordBreak(string &s, unordered_set<string> &dict) {
// write your code here
if(s.empty())
return true;
//新建一个字符串sd,统计所有dict里面的字符
string sd;
for(auto x:dict)
sd+=x;
int n = s.size();
vector<bool> mark(n+1,false);
mark[0] = true;
for(int i = 0 ; i < n ; i++)
{
//判断s里面的字符是否存在dict中,如果不存在,直接退出
if(!check(sd,s[i]))
return false;
for(int j = 0 ; j <= i ;j++)
{
string stemp = s.substr(i-j,j+1);
bool temp = dict.find(stemp) != dict.end();
mark[i+1] = mark[i+1]||(mark[i-j]&&temp);
if(mark[i+1])
break;
}
}
return mark[n];
}
bool check(string &sd,char c)
{
for(int i = 0 ; i < sd.size(); i++)
{
if(sd[i] == c)
return true;
}
return false;
}
};