天天刷leetcode(3) ---- 139.Word Break

问题描述

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.

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

  1. 拆分时可以重复使用字典中的单词。
  2. 你可以假设字典中没有重复的单词。

思路

在这里插入图片描述
如图,分为两条序列,s为给定的字符串,f为判断字符串中分割出的字母是否在字典中的标志。如图,当f到达j位置时,我们只需要判断[j+1…i]这段子字符串是否在字典中即可。

整体思路整理下来就是,利用f序列,跳过已经分割好的子字符串,判断当前标记到字符串末尾的内容是否在字典中即可。

有一种情况是整个字符串s即为字典中的内容。因此,在s字符串前加一段空字符,作为f的第一个标记。
代码如下

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> dict(wordDict.cbegin(), wordDict.cend()); //将vector形式转换为字典型,提高检索效率
        int n = s.length();
        s = " " + s;  // s[1...n]
        vector<int> f(n+1, 0);
        f[0] = 1;

        for(int i=1;i<=n;++i)
            for(int j=0;j<i;++j){
                if(f[j] == 1){
                    const string new_s = s.substr(j+1, i-j); // s[j+1...i]
                    if(dict.count(new_s)){
                        f[i] = 1;
                        break;
                    }
                }
            }
        return f[n];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值