leetcode Word Break 字典树+dp

来源:互联网 发布:c指针的编程题 编辑:程序博客网 时间:2024/06/08 05:03
#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()];    }};

0 0
原创粉丝点击