Word Break
动态规划
状态:fun[i]表示s[0..i]是否可以分词
转移方程:fun[i]=any_of(fun[j]&&s[j+1,i]∈dict),0≤j < 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); } };