题目:
给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。
样例:
给出
s="lintcode"
dict=["lint","code"]
返回 true 因为"lintcode"可以被空格切分成"lint code"
思路:
用res[i]代表字符串s的到第i个元素为止能不能用字典中的值来表示,可以的话为true。
能够表示的条件是:1. s[j,i]能够在字典中找到; 2. 并且res[j]为true。
本题要注意的是边界条件,字符串的下标是从0开始算的,即s[0]是第1个元素,对应的是res[1].
参考答案:
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
unordered_set<string>::iterator it;
//特殊情况
int n= s.length();
if(n == 0) return true;
if(dict.size() == 0) return false;
//res[i]指的是字符串s的第i个元素为止能不能用字典中的值来表示。
bool res[n+1];
memset(res,false,n+1);
/*
也可以用向量vector<bool> res(n+1,false);
*/
res[0] = true;
/*时间复杂度O(n*n)
for(int i=0; i<n; i++)
{
for(int j=i; res[i]&&j<n; j++)
{
string str = s.substr(i,j-i+1);
if(dict.find(str) != dict.end())
{
res[j+1] = true;
}
}
}*/
//时间复杂度是O(n*m)
for(int i=1; i<=n; i++)
{
for(it=dict.begin(); it!=dict.end();it++)
{
int j = (*it).length();
if(i<j) continue;
cout<<s.substr(i-j,j)<<endl;
if(*it == s.substr(i-j,j))
{
if(res[i-j])
{
res[i] = true;
}
}
}
}
return res[n];
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。