leetcode #139 in cpp

本文探讨了如何判断一个字符串是否能被分割成一个或多个字典中出现的单词序列。提供了两种解决方案:递归方法(带有剪枝)和动态规划方法,并详细展示了每种方法的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


Code 1:(recursive with pruning)

class Solution {
public:
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        if(s.empty()) return wordDict.find("") == wordDict.end()?false:true;
      
        int end = 0; 
        while( start < s.length() && end < s.length()){
            if(wordDict.find(s.substr(start,end - start + 1)) == wordDict.end()){
                end++; 
            }else{
                start = end + 1;
                end = start; 
            }
        }
        return start == end;
    }
    
    bool recursive_with_prune(int start, int end, string &s, unordered_set<string>& wordDict, vector<vector<int>> &res){
        
        if(start >= s.length()){
            return true;
        }
        if(end < s.length() && res[start][end] != -1){
            return res[start][end] == 1?true:false;
        }
        for(int i = end; i < s.length(); i ++){
            if(wordDict.find(s.substr(start, i- start + 1)) != wordDict.end() && recursive_with_prune(i+1, i+1, s, wordDict,res)){
                return true;
            }
        }
        res[start][end] = false; 
        return false; 
    }
};


Code 2: (DP)

class Solution {
public:
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        if(s.empty()) return wordDict.find("") == wordDict.end()?false:true;
        return dp(s,wordDict); 
    }
    bool dp(string &s, unordered_set<string>& wordDict){
        int n = s.length(); 
        vector<bool> dp(n,false); //dp[i] means s[0....i] can formed by the dict 
        for(int i = 0 ; i < n; i ++){ 
            if(wordDict.find(s.substr(0,i+1))!=wordDict.end()) dp[i] = true; 
            else{
                for(int j = 0; j < i; j ++){//if s[0...j] can be formed by dict and s[j+1,..,i] is in the dict, then dp[i] = true
                    if(dp[j] && wordDict.find(s.substr(j+1,i-j))!=wordDict.end())
                        dp[i] = true; 
                }
            }
        }
        return dp[n-1]; 
        
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值