【算法分析与设计】【第十五周】139. Word Break

题目来源: 139. https://leetcode.com/problems/word-break/description/

动态规划基础训练。

139. Word Break

题目大意

给定一个字符串和一个合法词的集和(词典),判断该字符串能否由词典中的词组成。


s= “leetcode”
wordDict = [“leet”,”code”]
return true

思路

《算法概论》P178Ex6.4

状态转移式:

// bool f[i]代表substr[0, i]能否由词典中的词组成
init:
f[0] = false (if s[0] !∈ wordDict) 
f[0] = true (if s[0] ∈ wordDict)

f[i] = ∪ {f[k] && substr[k+1, i] ∈ wordDict},k = 0, 1, ..., i-1

解题代码

坑主要在划分子串的时候,下标和迭代器的边界。


class Solution {
public:
  bool isWord(vector<string>& wordDict, string substr) {
    int dictSize = wordDict.size();
    for (int i = 0; i < dictSize; i++) {
      if (wordDict[i] == substr) return true;
    }
    return false;
  }
  bool wordBreak(string s, vector<string>& wordDict) {
    int len = s.length();
    string substr;
    if (len == 0) {
      if (isWord(wordDict, "")) return true;
      else return false;
    }
    if (len == 1) {
      if (isWord(wordDict, substr.assign(s.begin(), s.begin()+1))) return true;
      else return false;
    }
    bool f[len];
    if (isWord(wordDict, substr.assign(s.begin(), s.begin()+1))) f[0] = true;
    else  f[0] = false;
    bool flag = false;
    for (int i = 1; i < len; i++) {
      for (int k = 0; k < i; k++) {
        substr.assign(s.begin()+k+1, s.begin()+i+1);

        if ((f[k] == true && (isWord(wordDict, substr)) == true) 
            || isWord(wordDict, substr.assign(s.begin(), s.begin()+i+1)) == true) {
          f[i] = true;
          flag = true;
          break;
        }
      }
      if (flag == false) f[i] = false;
      flag = false;
    }
    //for (int i = 0; i < len; i++) cout << f[i] << " ";
    if (f[len-1] == true) return true;
    else return false;    
  }
};  // Runtime: 16 ms

时间复杂度

O(n^3)

可以说是直接把状态转移式照搬了,还需要优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值