(算法)Word Break

题目:

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

思路:

1、DFS

2、动态规划

代码:

#include<iostream>
#include<unordered_set>
#include<vector>

using namespace std;

// dp
bool WordBreak_dp(string s,unordered_set<string> &wordDict){
    int n=s.size();

    vector<bool> dp(n+1,false);
    dp[0]=true;

    for(int i=0;i<n;i++){
        for(int j=i;j>=0;j--){
            if(!dp[j]) continue;
            if(wordDict.find(s.substr(j,i-j+1))!=wordDict.end()){
                dp[i+1]=true;
                break;
            }
        }
    }
    return dp[n];

}

// dfs
bool WordBreak_dfs(string s,unordered_set<string> &wordDict){
    if(s=="") 
        return true;
    for(int i=0;i<s.size();i++){
        if(wordDict.find(s.substr(0,i+1))!=wordDict.end()){
            if(WordBreak_dfs(s.substr(i+1),wordDict))
                return true;
        }
    }
    return false;
}

int main(){
    unordered_set<string> wordDict;
    wordDict.insert("leet");
    wordDict.insert("code");
    string s;
    while(cin>>s){
        cout<< WordBreak_dp(s,wordDict) <<endl;
        cout<< WordBreak_dfs(s,wordDict) <<endl;
    }
    return 0;
}

 

posted @ 2015-10-20 22:20  AndyJee  阅读(538)  评论(0编辑  收藏  举报