LeetCode-139. Word Break

Description

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

Note

1.The same word in the dictionary may be reused multiple times in the segmentation.
2.You may assume the dictionary does not contain duplicate words.

Example 1

Input: s = "leetcode", wordDict = ["leet", "code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".

Example 2

Input: s = "applepenapple", wordDict = ["apple", "pen"]
Output: true
Explanation: Return true because "applepenapple" can be segmented as "apple pen apple".
             Note that you are allowed to reuse a dictionary word.

Example 3

Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false

Solution 1(C++)

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int slen = s.size();
        int dictlen = wordDict.size();
        vector<bool> dp(slen+1, false);
        dp[0] = true;
        for(int i=0; i<slen+1; i++){
            for(int j=0; j<dictlen; j++){
                if(dp[i]){
                    string temp = s.substr(i, wordDict[j].size());
                    if(temp == wordDict[j]) 
                        dp[i+wordDict[j].size()] =true;
                }
            }
        }
        return dp[slen];
    }
};

后续更新

其他类似的题目可参考:

算法分析

这道题与之前遇到了两种基本问题:求组合之和等于特定数字的组合个数;求组合之和等于特定数字的组合所需最少个数。也与LeetCode-416. Partition Equal Subset Sum不一样,虽然都是要判断能不能存在这样的组合,但是本题最大一个特点就是:元素组合不是说简单存在即可,而是有先后顺序。

求组合之和等于特定数字的组合个数这种问题,参考:LeetCode-279. Perfect Squares,在这个问题中,并没有考虑组合中元素的顺序问题。但是这道题,需要考虑元素的顺序,比如说:”applepenapple”,第一个元素是”apple”,这个元素必须要在”pen”之前与之后,所以这道题的顺序与前两道题都不一样。

定义A[i]表示0到下标为i的子字符能否被分割成dict中的多个单词。
那么A[i]与A[j],0<=j< i都有关系,即A[i]与前A[]中的前i-1项都有关系,具体为:

如果A[0]为1,判断s中下标从1开始到i结束的字符是否在dict中,如果在,设置A[i]为1,跳出,否则进入第二步;
如果A[1]为1,判断s中下标从2开始到i结束的字符是否在dict中,如果在,设置A[i]为1,跳出,否则进入第二步; 
….. 
这样一直遍历到A[i-1]位置。 

在上面的遍历过程中如果遍历到某一步j,A[j]=1并且j+1到i表示的字符串出现在dict中,表示前j个字符串能分割成dict中的单词,j+1到i中的字符串串也能分割成dict中的单词,这样表示前i个字符能被分割成dict中的单词。

程序分析

略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值