zoukankan      html  css  js  c++  java
  • leetcode[140] Word Break II

    这题是上一题的加强版,这里需要返回的是所有可能的分割词。例如:

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

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

    先用dp求得每个起点到终点是否符合word break 1中的条件,然后利用DFS来递归求解答案。需要注意的是,为了递归的方便,要注意dp要多一个dp[s.size() + 1]长度
    class Solution {
    public:
        //140
        void dfs140(string s, unordered_set<string> &dict, vector<string> &ans, vector<string> &vec, bool dp[], int start)
        {
            if (start == s.size())
            {
                if (vec.size() > 0)
                {
                    string str = vec[0];
                    for (int i = 1; i < vec.size(); i++)
                    {
                        str = str + " " + vec[i];
                    }
                    ans.push_back(str);
                }
                return ;
            }
            for (int i = 1; i <= s.size() - start; i++)
            {
                if (dict.count(s.substr(start, i)) && dp[start + i])
                {
                    vec.push_back(s.substr(start, i));
                    dfs140(s, dict, ans, vec, dp, start + i);
                    vec.pop_back();
                }
            }
        }
        vector<string> wordBreak(string s, unordered_set<string> &dict)
        {
            bool dp[s.size() + 1]; // 不同于上一题,这里需要多一位,最后一位为真,为了递归的时候方便
            memset(dp, 0, sizeof(dp));
            for (int i = 0; i < s.size(); i++)
            {
                if (dict.count(s.substr(i, s.size() - i)))
                    dp[i] = 1;
            }
            for (int i = s.size() - 1; i < s.size(); i--)
            {
                if (dp[i] == false)
                {
                    for (int j = i; j < s.size(); j++)
                    {
                        if (dict.count(s.substr(i, j - i + 1)) && dp[j + 1])
                            dp[i] = true;
                        if (dp[i])
                            break;
                    }
                }
            }
            dp[s.size()] = 1;
            vector<string> ans, tmp;
            dfs140(s, dict, ans, tmp, dp, 0);
            return ans;
        }
    };

    这题的思路很像leetcode Palindrome Partitioning II

  • 相关阅读:
    项目不能imports同名命名空间
    表格分页
    关于Web Post信息的编码
    JJHIS构想
    asp.net客户端传参的小结
    注销类业务的处理
    枚举类型的一些用法总结
    MO功能使能情况
    在内嵌页面得到某个内嵌页面所在的frame
    不同包里的全局变量定义方式及系统配置处理
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4160479.html
Copyright © 2011-2022 走看看