leetcode139.單詞拆分


給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict,判定 s 是否可以被空格拆分為一個或多個在字典中出現的單詞。

思路分析:

(1)比較容易想到的解法是,從字符串 s 開頭處開始匹配,若匹配到字典里的字符串,則繼續匹配剩下的字符串。這樣遞歸下去,直到找到一個可行的序列或嘗試所有的單詞組合。

提交的時候發現算法超時,后來想想其實這種解法存在很大的冗余,比如同時存在 a, b, ab的字典。只需記錄下字符串 s 中的序列可以被字典匹配到即可,其實就是動態規划的思想;

(2)采用動態規划解法,新建一個數組記錄下字符串 s 的子序列是否可以被字典拆分,依次求解字符串 s 從 0位置開始的的所有子序列是否可以被拆分。代碼如下:

    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> state(s.length()+1, false);
        state[0] = true;
        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j <= i ; j++) {
                if (state[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i-j)) != wordDict.end()) {
                    state[i] = true;
                }
            }
        }        
        return state[s.length()];
    }

 

接下來繼續解決單詞拆分2:

給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict,在字符串中增加空格來構建一個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。

思路分析:

返回所有可能的句子,即得到所有的子序列,可以直接采用上述分析(1)的方法,遞歸遍歷得到所有的可行子序列。代碼如下:

class Solution {
public:
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        vector<bool> state(s.length()+1, false);
        state[0] = true;

     //先判斷字符串 s 中是否能找到可行的拆分方案,再遞歸找出所有子序列。
for (int i = 1; i <= s.length(); i++) { for (int j = 0; j <= i ; j++) { if (state[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i-j)) != wordDict.end()) { state[i] = true; } } }
    
if (state[s.length()] == true) { string sentence; dfs(s, 0, sentence, wordDict); } return _sentences; } void dfs(string& s, int start, string& sentence, vector<string>& wordDict) { for (auto str : wordDict) { if (s.substr(start, str.size()) == str) { string nextSentence = sentence; if (nextSentence.length()) nextSentence.append(" "); nextSentence.append(str); int len = start + str.size(); if (len == s.size()) { _sentences.push_back(nextSentence); } else { dfs(s, len, nextSentence, wordDict); } } } } private: vector<string> _sentences; };

 


免責聲明!

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



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