[leetcode] Word Break

Word Break

动态规划

状态:fun[i]表示s[0..i]是否可以分词

转移方程:fun[i]=any_of(fun[j]&&s[j+1,i]∈dict),0j < i 

class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        //长度为n的字符串有n+1个隔板
        //开辟s.size()+1大小的vector,并初始化为false;
        vector<bool> fun(s.size()+1,false);
        fun[0]=true;//状态初始化,空字符串
        for(int i=1;i<=s.size();++i){
            for(int j=i-1;j>=0;--j){
                if(fun[j]&&dict.find(s.substr(j,i-j))!=dict.end()){//状态转移方程,substr()从j开始截取,截取长度为i-j
                    fun[i]=true;
                    break;
                }
            }
        }
        return fun[s.size()];//结果
    }
};


class Solution {//dfs
public:
    bool help(string &s,int now,unordered_set<string>& wd,vector<bool>& have){
        if(now>=s.length()){//字符串尾部
            return true;
        }
        if(have[now]){//已处理过
            return false;
        }
        have[now]=true;//标记为已处理
        for(int i=now;i<s.length();++i){
            if((wd.find(s.substr(now,i-now+1))!=wd.end())&&help(s,i+1,wd,have)){
                return true;
            }
        }
        return false;
    }
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        vector<bool> have(s.length(),false);//初始化为false
        return help(s,0,wordDict,have);//从0开始
    }
};

class Solution {//bfs
public:
    bool help(string &s,unordered_set<string>& wd,vector<bool>& have){
        if(s.length()==0){
            return true;
        }
        have[0]=true;//标记为已处理
        queue<int> q;
        for(q.push(0);!q.empty();q.pop()){
            int now=q.front();
            for(int i=now;i<s.length();++i){
                if(wd.find(s.substr(now,i-now+1))!=wd.end()){
                    if(i+1>=s.length()){//字符串结束
                        return true;
                    }
                    if(!have[i+1]){
                        have[i+1]=true;//标记
                        q.push(i+1);//入队
                    }
                }
            }
        }
        
    }
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        vector<bool> have(s.length(),false);//初始化为false
        return help(s,wordDict,have);
    }
};

class Solution {//dp
public:
    bool help(string &s,unordered_set<string>& wd,vector<bool>& dp){
        if(s.length()==0){
            return true;
        }
        dp[0]=true;//标记为已处理
        
        for(int now=0;now<s.length();++now){
            if(!dp[now]){
                continue;
            }
            for(int i=now;i<s.length();++i){
                if(wd.find(s.substr(now,i-now+1))!=wd.end()){
                    if(i+1>=s.length()){//字符串结束
                        return true;
                    }
                    dp[i+1]=true;//标记
                }
            }
        }
        
    }
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        vector<bool> have(s.length(),false);//初始化为false
        return help(s,wordDict,have);
    }
};


你可能感兴趣的:([leetcode] Word Break)