LeetCode: Word Break II [140]

來源:互聯網
上載者:User

標籤:leetcode   演算法   面試   

【題目】

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].

A solution is ["cats and dog", "cat sand dog"].


【題意】

    給定一個單詞s和詞典dict, 返回所有切分情況,使得切分後每個單詞都是dict中的單詞


【思路】

        依次確定以每個位置i結尾的單詞的前驅單詞集合(只要記住前驅單詞的結束位置)
        然後從後往前恢複切分路徑即可。
        DP問題

    


【代碼】
class Solution {public:        void recoverPath(vector<string>&result, vector<string>&words, string&s, map<int, vector<int> >preorders, int end){        vector<int>preorder=preorders[end];        for(int i=0; i<preorder.size(); i++){            string word=s.substr(preorder[i]+1, end-preorder[i]);            if(preorder[i]==-1){                string cutstr=word;                int size=words.size();                for(int j=size-1; j>=0; j--){                    cutstr+=" "+words[j];                }                result.push_back(cutstr);            }            else{                words.push_back(word);                recoverPath(result, words, s, preorders, preorder[i]);                words.pop_back();            }        }    }        vector<string> wordBreak(string s, unordered_set<string> &dict) {        vector<string> result;        if(s.length()==0)return result;        map<int, vector<int> >preorders;    //記錄各個可分位置的前驅集合        vector<int> pos(1,-1);         //以確定可分的位置                for(int i=0; i<s.length(); i++){            vector<int>preorder;            for(int k=0; k<pos.size(); k++){                if(dict.find(s.substr(pos[k]+1, i-pos[k]))!=dict.end()){                    preorder.push_back(pos[k]);                }            }            if(preorder.size()>0){                preorders[i]=preorder;                pos.push_back(i);            }        }                //恢複所有可能的切分路徑        if(preorders.find(s.length()-1)==preorders.end())return result;        vector<string>words;        recoverPath(result, words, s, preorders, s.length()-1);        return result;    }};


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.