Leetcode 139.单词拆分& Leetcode 55. 跳跃游戏【逆序再查找】

Leetcode 139.单词拆分

问题描述

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

说明:

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

输入:s = "leetcode", wordDict = ["leet", "code"]
输出:true

解题报告

dp[i]表示字符串s中从第0个字符到第i个字符是否可拆分。

判断dp[i]是否可拆分,从i-10逆序搜索,是否存在一个dp[j],其可拆分且第j个字符到第i个字符之简组成的字符在字典中可找到。

实现代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int n=s.size();
        set<string>setWords;
        for(int i=0;i<wordDict.size();i++){
            setWords.insert(wordDict[i]);
        }
        vector<int>dp(n+1,0);
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=i-1;j>=0;j--){
                if(dp[j]&&setWords.find(s.substr(j,i-j))!=setWords.end()){
                    dp[i]=1;
                    break;
                }
            }
        }
        return dp[n];
    }
};

参考资料

[1] Leetcode 跳跃游戏
[2] 题解区 bonheur

Leetcode 55. 跳跃游戏

问题描述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

解题报告

dp[i]表示第i个位置是否可达。

当判断dp[i]是否可达时, 从i-10逆序搜索,是否存在一个dp[j],其可达且j+num[j]>=i

实现代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n=nums.size();
        if(n==1){
            return 1;
        }
        vector<int>dp(n,0);
        dp[0]=1;
        for(int i=0;i<n;i++){
            for(int j=i-1;j>=0;j--){
                if(dp[j]&&j+nums[j]>=i){
                    dp[i]=1;
                    break;
                }
            }
        }
        return dp[n-1];
    }
};

参考资料

[1] Leetcode 55. 跳跃游戏

MD_
发布了139 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_27690765/article/details/105347058