解法:html
給定字符串,以及一個字典,判斷字符串是否可以拆分爲字段中的單詞。例如,字段爲{hello,world},字符串爲hellohelloworld,則能夠拆分爲hello,hello,world,都是字典中的單詞。緩存
這個題目喚做「分詞問題」,略顯寬泛。只是想說起這個問題,這是在天然語言處理,搜索引擎等等領域中,很是基礎的一個問題,解決的方法也比較多,相對比較成熟,不過這仍舊是一個值得進一步探索的問題。那咱們先從這個簡單的題目入手,看看如何處理題目中這個問題。 最直接的思路就是遞歸,很簡單。咱們考慮每個前綴,是否在字典中?若是在,則遞歸處理剩下的字串,若是不在;則考慮其餘前綴。示例代碼以下:ui
遞歸的方法實現:搜索引擎
可是這樣會有不少重複的查找:spa
這個題目的處理,上期的題目是很類似的。在遞歸子問題中,找重複的子問題。也很是明顯,以下圖(圖片來自GeeksforGeeks)所示:htm
若是使用動態規劃的方法:遞歸
bool wordBreak(string s, unordered_set<string> &dict) { if(dict.empty()||s.empty()) return false; unordered_map<string,bool> mp; auto iter=dict.begin(); while(iter!=dict.end()) { mp[*iter]=true; iter++; } return canBuildWord(s,mp); } bool canBuildWord(string s,unordered_map<string,bool> &mp) { if(mp.find(s)!=mp.end()) return mp[s]; for(int i=1;i<=s.length();i++) { string left=s.substr(0,i); string right=s.substr(i); if(mp.find(left)!=mp.end()&&mp[left]==true&&canBuildWord(right,mp)) return true; } mp[s]=false; return false; }
其中使用動態規劃的方法緩存了屢次調用之間的結果。若是該字符串在map中沒有找到,那麼將該字符串插入到map中,並將其值置爲false,若是下次仍是查找該字符串且該字符串在map中,而且值爲false,則能夠直接返回其在map中存放的值。索引
參考:http://www.myexception.cn/other/1444955.html圖片