word-break-ii

来源:互联网 发布:刘也行扒皮 知乎 编辑:程序博客网 时间:2024/05/09 07:42
题目描述
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s ="catsanddog",
dict =["cat", "cats", "and", "sand", "dog"].

A solution is["cats and dog", "cat sand dog"].

IDEA

1.判断字符串能够按照字典分割 isBreak()

2.组合可能分割的所有结果,递归:从字符串的最后一个字符开始向前遍历,将字符串分为两部分,后一部分是一个存在字典中的单词,并且前一个子串也能分割,则递归,然后将后一个子串连接到所有的结果中

CODE

class Solution {vector<bool> dp;public:    vector<string> wordBreak(string s, unordered_set<string> &dict) {        vector<string> res;        if(isBreak(s,dict)==false)            return res;        res=find_string(s,dict);        return res;    }    bool isBreak(string s, unordered_set<string> &dict) {        int len=s.length();        dp.resize(len+1);        dp[0]=true;        for(int i=1;i<=len;i++){            for(int j=i-1;j>=0;j--){                if(dict.find(s.substr(j,i-j))!=dict.end()&&dp[j]){                    dp[i]=true;                }            }        }        return dp[len];    }    vector<string> find_string(string s,unordered_set<string> &dict){        int len=s.length();        vector<string> res,tmp;        for(int i=len-1;i>=0;i--){            if(dict.find(s.substr(i,len-i))!=dict.end()&&dp[i]){                if(i==0){                    res.push_back(s);                }else{                    tmp=find_string(s.substr(0,i),dict);                    for(int j=0;j<tmp.size();j++){                        res.push_back(tmp[j]+" "+s.substr(i,len-i));                    }                }                                }        }        return res;    }  };


0 0
原创粉丝点击