zoukankan      html  css  js  c++  java
  • LeetCode || Word Break II

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

    即不仅要确定字符串能否被字典切割,还要找出全部可能的组合。參考word break那题的DP思路,首先,从尾部開始逆向看字符串 s ,循环截取一个存在的词(milestone 1),然后在截取的位置递归,继续向前看,继续截取。。。知道到达头部,此时组合出一种答案;然后进入milestone 1 处的下一次循环,例如以下图的milestone 1,截取另外一个词,找另外一个答案。。。




    代码例如以下:


    class Solution {
        vector<string> midres;
        vector<string> res;
        vector<bool> *dp;
    public:
        vector<string> wordBreak(string s, unordered_set<string> &dict) {
            int len = s.length();
            
            dp = new vector<bool>[len];
            for(int i=0; i<len; ++i){
                for(int j=i; j<len; ++j){
                    if(dict.find(s.substr(i, j-i+1))!=dict.end()){
                        dp[i].push_back(true);      //第二维的下标实际是:单词长度-1
                    }else{
                        dp[i].push_back(false);     //数组第二维用vector,size不一定是n,这样比n*n节省空间
                    }
                }
            }
            func(s, len-1);
            return res;
        }
        
        void func(const string &s, int i){
            if(i>=0){
                for(int j=0; j<=i; ++j){
                    
                    if(dp[j][i-j]){ //注意此处的第二个下标是 i-j,不是i,由于数组的第二维长度是不固定的,第二维的下标实际是单词长度-1
                    
                        midres.push_back(s.substr(j, i-j+1));
                        func(s, j-1);
                        midres.pop_back();  //继续考虑for循环的下一个分段处
                    }
                }
                return;
            }
            else{
                string str;
                for(int k=midres.size()-1; k>=0; --k){  //注意遍历的顺序是倒序的
                    str += midres[k];   //注意此处是k,不是i
                    if(k>0)
                        str += " ";
                }
                res.push_back(str);
                return;
            }
        }
    };
    
    
    注意递归函数的技巧,用全局变量res来保存答案,每次递归成功到达头部时将此中间结果保存到res。




  • 相关阅读:
    SharePoint 2013 中的SQL Server 安全
    SharePoint 2013 的HTML5特性之响应式布局
    SharePoint 2013 一些小技巧
    SharePoint 2013 排错之"Code blocks are not allowed in this file"
    SharePoint 2013 创建搜索中心及搜索设置
    SharePoint 2013 使用PowerShell创建State Service
    SharePoint 2013 内容部署功能简介
    SharePoint 使用PowerShell恢复误删的网站集
    SharePoint 自定义WebPart之间的连接
    linux之misc及使用misc创建字符设备
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4035071.html
Copyright © 2011-2022 走看看