LeetCode.139. 單詞拆分

LeetCode.139. 單詞拆分

傳送門

思路:1.dpdp。設dp[i]dp[i]ii個字符的子串能否滿足條件。用setset儲存單詞,然後枚舉末尾的子串查找是否爲單詞。時間複雜度:O(n2)O(n^2)

2.記憶化搜索,能用dpdp的都能用記憶化搜索。

dpdp代碼:

class Solution {
public:
    bool wordBreak(string s, vector<string>& a) {
         unordered_set<string>se;
         for(auto i:a)
            se.insert(i);
         vector<bool>dp(s.size()+1);
         dp[0]=true;
         for(int i=1;i<=s.size();i++)
           for(int j=i-1;j>=0;j--)
            if(dp[j]&&se.find(s.substr(j,i-j))!=se.end())
            {
                dp[i]=true;
                break;
            }
        return dp[s.size()];
    }
};

剪枝的dpdp

class Solution {
public:
    bool wordBreak(string s, vector<string>& a) {
         unordered_set<string>se;
         int mn=1e9,mx=0;
         for(auto i:a)
            se.insert(i),mn=min(mn,(int)i.size()),mx=max(mx,(int)i.size());
         vector<bool>dp(s.size()+1);
         dp[0]=true;
         for(int i=1;i<=s.size();i++)
           for(int j=max(i-mx,0);j<=i-mn;j++)
            if(dp[j]&&se.find(s.substr(j,i-j))!=se.end())
            {
                dp[i]=true;
                break;
            }
        return dp[s.size()];
    }
};

記憶化搜索:

class Solution {
public:
    unordered_set<string>se;
    bool dfs(string &s,int id,vector<int> &dp){
         if(id==0) return dp[0]=1;
         if(dp[id]!=-1) return dp[id]==1;
         for(int i=id-1;i>=0;i--){
             if(se.find(s.substr(i,id-i))!=se.end()){
                int ok=dfs(s,i,dp);
                if(ok){
                    dp[i]=1;
                    return 1;
                }
                else dp[i]=0;
             }
         }
       return 0;
    }
    bool wordBreak(string s, vector<string>& a) {
         for(auto i:a)
            se.insert(i);
        vector<int>dp(1000,-1);
         return dfs(s,s.size(),dp);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章