leetcode 140. 单词拆分 II

140. 单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

说明:

分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:

输入:
s = “catsanddog”
wordDict = [“cat”, “cats”, “and”, “sand”, “dog”]
输出:
[
“cats and dog”,
“cat sand dog”
]
示例 2:

输入:
s = “pineapplepenapple”
wordDict = [“apple”, “pen”, “applepen”, “pine”, “pineapple”]
输出:
[
“pine apple pen apple”,
“pineapple pen apple”,
“pine applepen apple”
]
解释: 注意你可以重复使用字典中的单词。
示例 3:

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


使用回溯的方法:但是回溯的过程中就超时了,前面一些简单的测试还是可以通过,太长的测试就会超时。之前我的方法有几个问题,首先就是没有在回溯的过程中使用记录表导致每次都要计算,使得效率不高,第二:我在进行字符串匹配的时候,是一个一个的匹配,这样回溯的时候也是一个一个的回溯,所以可以考虑使用一个字符串一个字符串的进行匹配,回溯的时候也是一个字符串一个字符串的回溯,效率提升。

说一下第二种方法的思路:
  1. 首先,创建回溯函数:在for循环中,对s的前面几个字符进行判断,如果s的开头是以字典里面的值开头的话,就在判断一下是后字典内的这个字符串的长度等于s的长度,如果两者相等,说明整个外层的s匹配完成,并且成功。否则,说明s后面还有一些未匹配的字符。
  2. 针对上一步s的后面还有一些未被匹配的字符,我们使用回溯的程序,将之前的待匹配字符s改为s[ len(word): ], 对后面的未匹配的字符串进行匹配。
  3. 这个时候,如果在for循环中运行匹配之后还是不能完全匹配,由于res.append(word)只有在完全匹配之后才会添加值进去,所以如果出现不能完全匹配的情况,那么backtrack子程序的返回值是 [ ]。
  4. 如果有一次完全匹配了,那么它的第一次返回值rest = res = s中最后一个字典字符串,这时的 s 和 res是相同的。并且这里还会将 memo[s] = res ,加入记录表内。
  5. 第一次返回得到s中最后一个字典符,赋值dog给rest, 此时的word等于dog前面一个匹配的字符:sand, s则为 sanddog,循环对rest内部取值, 将word+空格+rest内的值赋值给res,此时完成了一轮循环, res = “sand dog”,加入记录表。第二次返回res。
  6. 这时的word = cat, rest = "sand dog"等于返回值,在使用 item = word + " " + item,将cat加在rest前面,并且赋值给res,此时接着之前的for循环继续运行。
  7. 这个时候由于是处于第一轮,所以 s = “catsanddog”,之前匹配的是cat,这次匹配的是cats,之后的过程和上面的差不多,就不赘述了。
from typing
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值