【Leetcode139】Word Break

祥和是一個動態規劃問題,原因在於每個地方都有可能作爲分割點,在“可以”作爲分割點的情況下,不一定就要在這裏分割,例如:

一直s="aaaaaaa"共7個'a',字典{“aaa", "aaaa"}。如果把前6個a分成了2組”aaa",那麼剩下的一個就分割不了,所以說這裏要討論的是到index處可不可以分割成完整的,再例如

index1, index2, index3代表3個位置的索引,如果想要知道1~index3可不可以分解,我們已知0~index2可不可以分解,剩下的就是判斷index2+1~index3是不是word,如果不可以,也不能說明什麼,說明如果真的在這裏分割了,那麼後面就不成立了,所以雖然0~index2可以完整分割,我們 不一定接受這個建議。繼續往前,0~index1之間也是可以完整分割的,那麼就來分析index1~index3是不是word。。。注意,這裏說的是indexx~index3之間是否存在word而不是可不可以分割

動態規劃特點是反向推,根據子問題求解現在的問題。 

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        std::vector<bool> flag(s.length()+1, false);
        flag[0] = true;
        for(int i = 0; i < s.length(); ++i){//包括i可分,保存在i+1位置,例如0位置可分的flag在1
            for(int j = i-1; j >= -1; --j){
                if(flag[j+1] && wordSet.count(s.substr(j+1, i-j))){
                    flag[i+1] = true;
                    break;
                }
            }
        }
        return flag.back();
    }
};

c++代碼上的注意;

1、這裏用了unorderd_set,好處unordered哈希表,查找速度快,set與map相比只需要保存一種數據類型;

2、我也沒想到vector竟然真的可以初始化unordered_set,那set肯定也可以了;

3、flag的設置,用於標誌截止到某個位置,是否可分,這裏flag[i]實際上保存的是截止且包含s[i-1]是否可分,flag[0]保存的是s[-1],這個位置的意義在於,虛擬出來一個initial,也就是是s[-1]這麼個肯本不存在的東西,因爲需要使用它去初始化s[0]對應的bool標誌位

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章