給定一組單詞,編寫一個程序,找出其中的最長單詞,且該單詞由這組單詞中的其餘單詞組合而成。

 

 

解法: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圖片

相關文章
相關標籤/搜索