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

    [解题思路]

    DFS + backtracking

    在大数据:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", ["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]通不过。

    C++实现代码:

    #include<iostream>
    #include<unordered_set>
    #include<string>
    #include<cstring>
    using namespace std;
    
    class Solution
    {
    public:
        bool wordBreak(string s, unordered_set<string> &dict)
        {
            int len=s.length();
            if(len==0)
                return true;
            bool dp[len+1];
            memset(dp,0,sizeof(dp));
            int i,j;
            for(i=1; i<=len; i++)
            {
                if(dp[i]==false&&dict.count(s.substr(0,i))>0)
                    dp[i]=true;
                if(i==len&&dp[i]==true)
                    break;
                if(dp[i]==true)
                {
                    for(j=i+1; j<=len; j++)
                    {
                        if(dp[j]==false&&dict.count(s.substr(i,j-i))>0)
                            dp[j]=true;
                        if(j==len&&dp[j]==true)
                            break;
                    }
                }
            }
            if(i==len||j==len)
                return dp[i]||dp[j];
            return false;
        }
    };
    
    int main()
    {
        unordered_set<string> dict= {"cat", "cats", "and", "sand", "dog"};
        Solution s;
        string ss = "catsanddog";
        cout<<s.wordBreak(ss,dict)<<endl;
    }

     2.DP+DFS

    使用Word Break对字符串进行处理,处理结束后使用DFS进行DFS。

    #include<iostream>
    #include<unordered_set>
    #include<string>
    #include<cstring>
    #include<vector>
    using namespace std;
    
    class Solution
    {
    public:
        vector<string> ss;
        vector<string> wordBreak(string s, unordered_set<string> &dict)
        {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            int n=s.size();
            ss.clear();
            bool dp[n];
            memset(dp,false,sizeof(dp));
            for(int i=0; i<n; i++)
                dp[i]=false;
            for(int j=n-1; j>=0; j--)
            {
                for(int i=j; i<n; i++)
                {
                    string t(s.begin()+j,s.begin()+i+1);
                    if( dict.find(t)!=dict.end() )
                    {
                        if( ( i+1<n && dp[i+1])|| i==n-1)
                            dp[j]=true;
                    }
                }
            }
            dfs(0,n,s,string (""),dict,dp);
            return ss;
        }
        void dfs(int st,int n,string str,string cur,unordered_set<string> &dict,bool dp[])
        {
            if(st==n)
            {
                ss.push_back(cur);
                return ;
            }
            for(int i=st; i<n; i++)
            {
                string t(str.begin()+st,str.begin()+i+1);
                if((dp[i+1]||i+1==n) &&  (dict.find(t)!=dict.end() ))
                {
                    int c=cur.size();
                    cur+=t;
                    if(i<n-1)
                        cur.push_back(' ');
                    dfs(i+1,n,str,cur,dict,dp);
                    cur.resize(c);
                }
            }
        }
    };
    
    int main()
    {
        unordered_set<string> dict= {};
        Solution s;
        string ss = "a";
        vector<string> result=s.wordBreak(ss,dict);
        for(auto a:result)
            cout<<a<<endl;
    }

    参考:http://blog.csdn.net/cs_guoxiaozhu/article/details/14104789

  • 相关阅读:
    javascript js date ios手机浏览器出现 NAN的问题解决方法
    DWG TrueView 2022
    FloatingActionButton(悬浮按钮)使用学习<一>
    Android多线程编程<一>Android中启动子线程的方法
    Android多线程编程<二>Handler异步消息处理机制之Message
    Java:类的构造函数
    Java:类与对象概念
    APP免邀请码安装
    .NET4安装总进度一直不动的解决办法
    bitmap缩放时抗锯齿
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4136986.html
Copyright © 2020-2023  润新知