#include <string.h>
struct node
{
bool flag;
node *next[26];
node()
{
flag=0;
memset(next,0,sizeof(next));
}
};
int dp[1000000];
class Solution {
public:
node *root;
Solution()
{
root=new node;
}
void insert(string s)
{
for(int i=0;i<s.size()/2;i++)// 反向的字典树
swap(s[i],s[s.size()-1-i]);
node *p=root;
for(int i=0;i<s.size();i++)
{
if(p->next[s[i]-'a']==NULL)
{
p->next[s[i]-'a']=new node;
}
p=p->next[s[i]-'a'];
}
p->flag=true;
}
bool wordBreak(string s, unordered_set<string> &dict) {
memset(dp,0,sizeof(dp));
unordered_set<string>::iterator it=dict.begin();
while(it!=dict.end())
{
insert(*it);
it++;
}
dp[0]=1;
for(int i=1;i<=s.size();i++)
{
node *p=root;
for(int j=i;j>0;j--)
{
p=p->next[s[j-1]-'a'];
if(!p)
break;
if(dp[j-1]&&p->flag)
{
dp[i]=true;
break;
}
}
}
return dp[s.size()];
}
};
leetcode Word Break 字典树+dp
最新推荐文章于 2022-09-04 10:52:47 发布