leetcode 139单词拆分

简介: leetcode 139单词拆分

单词拆分

a5b6d142b78a404baab063218016d0fb.png

动态规划

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。
拆分时可以重复使用字典中的单词,说明就是一个完全背包!


dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。

dp[0]初始为true完全就是为了推导公式。

下标非0的dp[i]初始化为false,只要没有被覆盖说明都是不可拆分为一个或多个在字典中出现的单词。

1e233e04b60b4d66a438501c16e3c77d.png


dp[j]=true 来自于 dp[i]=true + 字串s(i,j-i)可以在字典中找到。

例如输入“leetcode” ,dp[ 0 ] 初始化为1 ,

dp[ 4 ] = 1 , 因为 dp[ 0 ] =1 ,字串 s( 0 , 4 - 0)即”leet“ 可以在字典找到

dp[ 8 ] = 1 , 因为 dp[ 4 ] =1 ,字串 s( 4 , 8 - 4)即”code“ 可以在字典找到

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size()+1 ,false);
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        dp[0] = true;
        // dp[j]=true 来自于 dp[i]=true + 字串s(i,j-i)可以在字典中找到。
        for(int j = 1 ; j<=s.size() ; j++)//背包尺寸
        {
            for(int i = 0 ; i < j ;i++ )//字串长度
            {
                string word = s.substr( i , j-i );
                if(wordSet.find(word) != wordSet.end() && dp[i]==true )
                    dp[j] = true;
            }  
        }
        // for(auto it:dp) cout<<it<<' ';
        return dp[s.size()];
    }
};

二刷

回溯(超时)

class Solution {
public:
    bool result = false;
    vector<string> path;
    void track_back(string &s, vector<string>& wordDict ,int indnx)
    {
        if(result == true) return;
        if(path.size() != 0)
        {
            string tmp;
            for(int i=0 ; i<path.size();i++)
                tmp += path[i];
            if(tmp.size() > s.size()) return;
            else if(tmp == s) 
            {
                result = true;
                return;
            }
        }
        for(int i=indnx ; i<wordDict.size() ;i++)
        {
            path.push_back(wordDict[i]);
            track_back(s,wordDict,indnx);
            path.pop_back();
        } 
        return;
    }
    bool wordBreak(string s, vector<string>& wordDict) {
        track_back(s,wordDict,0);
        return result;
    }
};

动态规划

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> wordDict_set(wordDict.begin(),wordDict.end());
        vector<bool> dp(s.size()+1 , false);
        dp[0] = true;
        for(int j=1 ; j<=s.size() ;j++)
        {
            for(int i=0 ; i<j ; i++)
            {
                string tmp = s.substr(i,j-i);
                if(wordDict_set.find(tmp) != wordDict_set.end() && dp[i] == true)
                    dp[j] = true;
            }
        }
        return dp[s.size()];
    }
};
相关文章
|
2月前
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
22 0
|
2月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
20 0
|
4月前
|
算法
LeetCode第58题最后一个单词的长度
LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
LeetCode第58题最后一个单词的长度
|
4月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
53 4
|
4月前
|
Python
【Leetcode刷题Python】生词本单词整理
文章提供了一个Python程序,用于帮助用户整理和排版生词本上的单词,包括去除重复单词、按字典序排序,并按照特定的格式要求进行打印排版。
47 3
|
4月前
|
Python
【Leetcode刷题Python】343. 整数拆分
LeetCode 343题 "整数拆分" 的Python解决方案,使用动态规划算法来最大化正整数拆分为多个正整数之和的乘积。
31 0
|
4月前
|
Python
【Leetcode刷题Python】318. 最大单词长度乘积
本文提供了LeetCode题目318的Python编程解决方案,题目要求在一个字符串数组中找出两个不含有公共字母的单词,且这两个单词的长度乘积最大,如果不存在这样的两个单词,则返回0。
21 0
|
6月前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
6月前
|
存储 SQL 算法
LeetCode题58: 5种算法实现最后一个单词的长度【python】
LeetCode题58: 5种算法实现最后一个单词的长度【python】
|
6月前
|
算法 测试技术 索引
力扣经典150题第三十二题:串联所有单词的子串
力扣经典150题第三十二题:串联所有单词的子串
30 0