[LeetCode] Word Break 解題思路


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".

解題思路:

問題: 根據給定的單詞字典,判斷一個字符串是否可以全部被分割為有效單詞。

第一個問題,給定一個字符串, 怎么判斷它是不是一個有效單詞呢?

本人首先想到是之前做過的 Trie Tree ,打算用 Trie Tree 結構來判斷一個字符串是不是一個有效單詞。

后來才知道, unordered_set 是 C++ 自帶的數據結構,能直接用來檢索一個字符串是否為有效單詞。囧。看來對 C++ 還不夠熟悉。

值得一提的是,用 Trie Tree 實現的算法也通過了 LeetCode 的測試,當然,unordered_set 的完成效率更快。

 

 

第二個問題,如何判斷一個字符串是否可以全部被分割為有效單詞,即原問題。

假設將字符串 s 分割為兩段,[0,i-1], [i, n-1],如果[0, i-1] 為有效單詞,[i, n-1]為有效單詞集合,那么 s 就是一個有效字符串。

將 i 從 1 到 n-1 遍歷一次,求得 s 是否是一個有效字符串。

 

第三個問題,效率滿,出現很多反復求解的子問題。

DP思路,即表格法,記錄已計算結果。

 

    vector<int> v;

    bool isMatch(string s, unordered_set<string>& wordDict){
        
        unordered_set<string>::iterator us_iter = wordDict.find(s);
        
        if (us_iter != wordDict.end()) {
            return true;
        }
        
        
        for (int i = 1 ; i < s.size(); i++) {
            string leftS = s.substr(0, i);
            
            unordered_set<string>::iterator leftS_iter = wordDict.find(leftS);
            if (leftS_iter != wordDict.end()) {
                
                bool isWordR;
                if (v[i] != -1) {
                    isWordR = v[i];
                }else{
                    isWordR = isMatch(s.substr(i, s.size() - i), wordDict);
                    v[i] = isWordR;
                }
                
                if (isWordR) {
                    return true;
                }
            }
        }
        
        return false;
    }

    bool wordBreak(string s, unordered_set<string>& wordDict) {
        vector<int> tmp(s.size(), -1);

        v = tmp;
        bool res = isMatch(s, wordDict);
        
        return res;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM