[leetcode] Word Break

来源:互联网 发布:c面向对象编程思想 编辑:程序博客网 时间:2024/06/08 17:59

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given

s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".


第一种方法:递归(超时)Time Limit Exceeded

思路:从s的第一个字母向后匹配,如果i前面的前缀可以匹配,就看s字符串i以后的后缀是否匹配

Last executed input:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", ["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]


[cpp] view plaincopyprint?
  1. bool wordBreak(string s, unordered_set<string> &dict) {  
  2.         // Note: The Solution object is instantiated only once.  
  3.         if(s.length() < 1) return true;  
  4.         bool flag = false;  
  5.         for(int i = 1; i <= s.length(); i++)  
  6.         {  
  7.             string tmpstr = s.substr(0,i);  
  8.             unordered_set<string>::iterator it = dict.find(tmpstr);  
  9.             if(it != dict.end())  
  10.             {  
  11.                 if(tmpstr.length() == s.length())return true;  
  12.                 flag = wordBreak(s.substr(i),dict);  
  13.             }  
  14.             if(flag)return true;  
  15.         }  
  16.         return false;  
  17.     }  


第二种方法:dpAccepted

思路:从s的第一个字母向后匹配,如果i前面的前缀可以匹配,就看s字符串i以后的后缀是否匹配,在找后缀是否匹配时添加了记忆功能。

[cpp] view plaincopyprint?
  1. bool wordBreakHelper(string s, unordered_set<string> &dict,set<string> &unmatch) {  
  2.         if(s.length() < 1) return true;  
  3.         bool flag = false;  
  4.         for(int i = 1; i <= s.length(); i++)  
  5.         {  
  6.             string prefixstr = s.substr(0,i);  
  7.             unordered_set<string>::iterator it = dict.find(prefixstr);  
  8.             if(it != dict.end())  
  9.             {  
  10.                 string suffixstr = s.substr(i);  
  11.                 set<string>::iterator its = unmatch.find(suffixstr);  
  12.                 if(its != unmatch.end())continue;  
  13.                 else{  
  14.                     flag = wordBreakHelper(suffixstr,dict,unmatch);  
  15.                     if(flag) return true;  
  16.                     else unmatch.insert(suffixstr);  
  17.                 }  
  18.             }  
  19.         }  
  20.         return false;  
  21.     }  
  22.     bool wordBreak(string s, unordered_set<string> &dict) {  
  23.         // Note: The Solution object is instantiated only once.  
  24.         int len = s.length();  
  25.         if(len < 1) return true;  
  26.         set<string> unmatch;  
  27.         return wordBreakHelper(s,dict,unmatch);  
  28.     }  

dp改进:dict中的单词有的长有的短,当prefixstr串小于最短串时就不匹配了,当prefixstr串大于最长的串时也不用匹配了。多谢@阿桂爱清净

[cpp] view plaincopyprint?
  1. bool wordBreakHelper(string s,unordered_set<string> &dict,set<string> &unmatched,int mn,int mx) {  
  2.         if(s.size() < 1) return true;  
  3.         int i = mx < s.length() ? mx : s.length();  
  4.         for(; i >= mn ; i--)  
  5.         {  
  6.             string preffixstr = s.substr(0,i);  
  7.             if(dict.find(preffixstr) != dict.end()){  
  8.                 string suffixstr = s.substr(i);  
  9.                 if(unmatched.find(suffixstr) != unmatched.end())  
  10.                     continue;  
  11.                 else  
  12.                     if(wordBreakHelper(suffixstr, dict, unmatched,mn,mx))  
  13.                         return true;  
  14.                     else  
  15.                         unmatched.insert(suffixstr);  
  16.             }  
  17.         }  
  18.         return false;  
  19.     }  
  20.     bool wordBreak(string s, unordered_set<string> &dict) {  
  21.         // Note: The Solution object is instantiated only once.  
  22.         if(s.length() < 1) return true;  
  23.         if(dict.empty()) return false;  
  24.         unordered_set<string>::iterator it = dict.begin();  
  25.         int maxlen=(*it).length(), minlen=(*it).length();  
  26.         for(it++; it != dict.end(); it++)  
  27.             if((*it).length() > maxlen)  
  28.                 maxlen = (*it).length();  
  29.             else if((*it).length() < minlen)  
  30.                 minlen = (*it).length();  
  31.         set<string> unmatched;  
  32.         return wordBreakHelper(s,dict,unmatched,minlen,maxlen);  
  33.     }  
0 0
原创粉丝点击