问题描述:
给定一个非空的字符串,和包含一系列非空单词的词典worddict,确定s是否是一个可以分割成一个或多个字典里的单词的序列。你可以假设字典里不包含重复的单词。
解题思路:
设布尔数组v[i]表示由s中前i个字符组成的字符串是否可以被分割成一个或多个字典里的单词,最后返回v[s.size()]。
状态转移方程如下:
v[i]=OR(v[j]&&find(s.substr(j,i-j),wordDict)),其中j的范围在0到i-1之间
OR表示连续求或,s.substr(j,i-j)表示s中从s[j]到s[i-1]的子串,find函数用于查找一个字符串是否在字典中。
源代码如下:
class Solution {
public:bool find(string s,vector<string>& wordDict)
{
for(int i=0;i<wordDict.size();i++)
{
if(wordDict[i]==s) return true;
}
return false;
}
bool wordBreak(string s, vector<string>& wordDict) {
int size=s.size()+1;
bool v[size];
v[0]=true;
for(int i=1;i<size;i++)
{
v[i]=false;
for(int j=0;j<i;j++)
if(v[j]&&find(s.substr(j,i-j),wordDict)==true) v[i]=true;
}
return v[size-1];
}
};