代码随想录day46 | 39.单词拆分

39.单词拆分

题目|文章
image

思路

  1. 数组以及下标含义
    dp[i]:字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。
  2. 递推关系
    如果word出现在列表中,即[j,i]的子串出现在列表中,并且word之前的单词部分为true,那么这个子串为true
    3.初始化
    dp[0] = true,这是整个计算开始的基础

实现

点击查看代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size()+1, false);
        unordered_set<string> uset(wordDict.begin(), wordDict.end());
        dp[0] = true;
        for(int i = 1; i <= s.size(); i++) {
            for(int j = 0; j < i; j++) {
                string word = s.substr(j,i-j);
                if(uset.find(word) != uset.end() && dp[j]){
                    dp[i] = true;
                    cout<<i<<endl;
                }
            }
        }
        return dp[s.size()];
    }
};

复杂度分析

  • 时间复杂度:O(n×m),n为列表的个数,m为字符串的长度
  • 空间复杂度:O(n)
posted @ 2022-11-09 16:01  缩地  阅读(18)  评论(0)    收藏  举报