mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
update 0139.单词拆分:优化文本 和 go 代码风格
This commit is contained in:
@ -138,7 +138,7 @@ public:
|
|||||||
|
|
||||||
3. dp数组如何初始化
|
3. dp数组如何初始化
|
||||||
|
|
||||||
从递归公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递归的根基,dp[0]一定要为true,否则递归下去后面都都是false了。
|
从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。
|
||||||
|
|
||||||
那么dp[0]有没有意义呢?
|
那么dp[0]有没有意义呢?
|
||||||
|
|
||||||
@ -152,13 +152,13 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。
|
|||||||
|
|
||||||
题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。
|
题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。
|
||||||
|
|
||||||
还要讨论两层for循环的前后循序。
|
还要讨论两层for循环的前后顺序。
|
||||||
|
|
||||||
**如果求组合数就是外层for循环遍历物品,内层for遍历背包**。
|
**如果求组合数就是外层for循环遍历物品,内层for遍历背包**。
|
||||||
|
|
||||||
**如果求排列数就是外层for遍历背包,内层for循环遍历物品**。
|
**如果求排列数就是外层for遍历背包,内层for循环遍历物品**。
|
||||||
|
|
||||||
我在这里做一个一个总结:
|
我在这里做一个总结:
|
||||||
|
|
||||||
求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)
|
求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)
|
||||||
求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
|
求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
|
||||||
@ -170,7 +170,7 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。
|
|||||||
|
|
||||||
"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。
|
"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。
|
||||||
|
|
||||||
所以说,本题一定是 先遍历 背包,在遍历物品。
|
所以说,本题一定是 先遍历 背包,再遍历物品。
|
||||||
|
|
||||||
5. 举例推导dp[i]
|
5. 举例推导dp[i]
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ public:
|
|||||||
|
|
||||||
关于遍历顺序,再给大家讲一下为什么 先遍历物品再遍历背包不行。
|
关于遍历顺序,再给大家讲一下为什么 先遍历物品再遍历背包不行。
|
||||||
|
|
||||||
这里可以给出先遍历物品在遍历背包的代码:
|
这里可以给出先遍历物品再遍历背包的代码:
|
||||||
|
|
||||||
```CPP
|
```CPP
|
||||||
class Solution {
|
class Solution {
|
||||||
@ -241,7 +241,7 @@ public:
|
|||||||
|
|
||||||
最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。
|
最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。
|
||||||
|
|
||||||
除非是先用 "apple" 遍历一遍,在用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。
|
除非是先用 "apple" 遍历一遍,再用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。
|
||||||
|
|
||||||
如果大家对这里不理解,建议可以把我上面给的代码,拿去力扣上跑一跑,把dp数组打印出来,对着递推公式一步一步去看,思路就清晰了。
|
如果大家对这里不理解,建议可以把我上面给的代码,拿去力扣上跑一跑,把dp数组打印出来,对着递推公式一步一步去看,思路就清晰了。
|
||||||
|
|
||||||
@ -352,16 +352,16 @@ class Solution:
|
|||||||
Go:
|
Go:
|
||||||
```Go
|
```Go
|
||||||
func wordBreak(s string,wordDict []string) bool {
|
func wordBreak(s string,wordDict []string) bool {
|
||||||
wordDictSet:=make(map[string]bool)
|
wordDictSet := make(map[string]bool)
|
||||||
for _,w:=range wordDict{
|
for _, w := range wordDict {
|
||||||
wordDictSet[w]=true
|
wordDictSet[w] = true
|
||||||
}
|
}
|
||||||
dp:=make([]bool,len(s)+1)
|
dp := make([]bool, len(s)+1)
|
||||||
dp[0]=true
|
dp[0] = true
|
||||||
for i:=1;i<=len(s);i++{
|
for i := 1; i <= len(s); i++ {
|
||||||
for j:=0;j<i;j++{
|
for j := 0; j < i; j++ {
|
||||||
if dp[j]&& wordDictSet[s[j:i]]{
|
if dp[j] && wordDictSet[s[j:i]] {
|
||||||
dp[i]=true
|
dp[i] = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user