leetcode 139. Word Break 、140. Word Break II

139. Word Breakspa

字符串可否經過劃分紅詞典中的一個或多個單詞。code

使用動態規劃,dp[i]表示當前以第i個位置(在字符串中其實是i-1)結尾的字符串可否劃分紅詞典中的單詞。blog

j表示的是以當前i的位置往前找j個單詞,若是在j個以前能正確分割,那隻需判斷當前這j單詞能不能在詞典中找到單詞。j的個數不能超過詞典最長單詞的長度,且同時不能超過i的索引。索引

初始化時要初始化dp[0]爲true,由於若是你找第一個恰好匹配成功的,你的dp[i - j]確定就是dp[0]。由於多申請了一個,因此dp中的i至關於s中的i-1。rem

s.substr(i-j,j)其實是s.substr(i-j + 1 - 1,j),由於自己應該提取i - j +1,但由於dp位置比s多一個,因此還要-1。字符串

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int length = 0;
        for(string word : wordDict){
            if(word.size() > length)
                length = word.size();
        }
        vector<bool> dp(s.size() + 1,false);
        dp[0] = true;
        for(int i = 1;i <= s.size();i++){
            for(int j = 1;j <= length && j <= i;j++){
                if(dp[i-j]){
                    string str = s.substr(i-j,j);
                    for(string word : wordDict){
                        if(word == str){
                            dp[i] = true;
                            break;
                        }
                    }
                }
            }
        }
        return dp[s.size()];
    }
};

 

 

140. Word Break IIstring

一個字符串加空字符串仍是原字符串io

class Solution {
public:
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        unordered_map<string, vector<string>> m;
        return helper(s, wordDict, m);
    }
    vector<string> helper(string s, vector<string>& wordDict, unordered_map<string, vector<string>>& m) {
        if (m.count(s)) return m[s];
        if (s == "") return {""};
        vector<string> res;
        for (string word : wordDict) {
            if (s.substr(0, word.size()) != word) continue;
            vector<string> rem = helper(s.substr(word.size()), wordDict, m);
            for (string str : rem) {
                res.push_back(word + (str.empty() ? "" : " ") + str);
            }
        }
        m[s] = res;
        return res;
    }
};
相關文章
相關標籤/搜索