【leetcode】字符串单词拆分java和python实现

题目:

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

说明:

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

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

 

 

示例 2:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

解题:

题目的要求就是,一个字符串必须刚好被分为几个单词且这几个单词都在词典里,像实例3那样子交叉着是不行的,要独立分出来,其实这样就反而简单了呢。

假如有一个字符串是“youarelovely”,作为一个普通人,先想到是从头开始找第一个字典里的单词,也就是you;

然后再找发现are在字典里,而are前面的you也被确认过了,那么l以前的都在字典里可查;

再接着看,发现lovely也在字典里,而且e及以前的都被确认存在了,那么y及以前的都在字典里可查;

y之后没有了,返回y记录,发现是true,说明这整个字符串在字典里都有迹可循,完工。

 

以上就是一个动态规划的办法,动态规划需要有一个规则,也就是什么时候赋什么值。查了一个新词儿是对的,而且这个词儿之前的老词儿都对,那么新词儿及以前的都对,查后面的就行了。设置一个dp一维数组,当前字母及以前的内容都符合,设为true,如果0到i的之前都被确认过存在,而且i到j的刚刚确定存在,则可以说j及以前的都在词典里符合要求。

 

PS:注意注意!dp[0]要设为true,因为dp[i]表示的是i以前字符串是否符合要求,不包括i,因此为了让最后一个字符有存在感,dp长度要设为字符串长度+1。而dp[0]表示的是0以前位置的内容,为了符合if语句(前面的部分为真 且 后面的部分也可查)要设置为true。

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int len=s.length();
        boolean[] dp=new boolean[len+1];
        dp[0]=true;
        HashSet<String> set=new HashSet<>();//为了快速查字典,放到一个无重复的集合里
        for(String str:wordDict){
            set.add(str);
        }
        for(int i=0;i<len;i++){
            for(int j=i;j<len;j++){
                if(dp[i] && set.contains(s.substring(i,j+1)))//前面的都可查,后面一段也可查
                    dp[j+1]=true;
            }
        }
        return dp[len];
    }
}
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        n=len(s)
        dp=[False]*(n+1)
        dp[0]=True
        for i in range(n):
            for j in range(i+1,n+1):
                if(dp[i] and (s[i:j]in wordDict)):
                    dp[j]=True
        return dp[-1]

https://www.cnblogs.com/zhangmora/p/12630005.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值