当前位置: 首页 > wzjs >正文

西部数码网站管理助手3.1网络营销主要做些什么工作

西部数码网站管理助手3.1,网络营销主要做些什么工作,东莞网站建设制作免费咨,怎样做外贸🚀 LeetCode 热题 139:单词拆分(Word Break)| 动态规划全解析细节陷阱 📌 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请判断 s 是否可以由字典中出现的单词拼接成。 说明:不要求字典…

🚀 LeetCode 热题 139:单词拆分(Word Break)| 动态规划全解析+细节陷阱

📌 题目描述

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请判断 s 是否可以由字典中出现的单词拼接成。

说明:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

🎯 示例 1:

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

🎯 示例 2:

输入:s = "applepenapple", wordDict = ["apple", "pen"]
输出:true
解释:可以拼接成 "apple pen apple",可以重复使用 wordDict 中的单词。

🎯 示例 3:

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

💡 解题思路一:动态规划(DP)

我们定义一个布尔类型的一维数组 dp[i] 表示 s[0:i] 这个子串是否可以由字典中的单词组成。

🧱 状态定义:

我们用一个布尔数组 dp[i] 表示:

从字符串的起始位置(下标 0)到位置 i 的子串 s[0:i] 是否可以被成功拆分成一个或多个字典中的单词。

注意:这里的 i 是长度,不是下标(下标是 i-1)。


✅ 状态转移方程:

dp[i] = true,若存在 j,使得 dp[j] == true 且 s[j:i] 在 wordDict 中

也就是说,如果前面某个位置 j 之前的子串可以被拼出,并且 s[j:i] 在字典中,那 dp[i] 就可以设置为 true

✅ 初始条件:

dp[0] = true  // 空字符串可视为已完成

💻 Go 实现代码(动态规划)

func wordBreak(s string, wordDict []string) bool {wordSet := make(map[string]bool)for _, word := range wordDict {wordSet[word] = true}dp := make([]bool, len(s)+1)dp[0] = truefor i := 1; i <= len(s); i++ {for j := 0; j < i; j++ {if dp[j] && wordSet[s[j:i]] {dp[i] = truebreak}}}return dp[len(s)]
}

🔍 注意点 & 边界问题解析

✅ 注意 1:不要和子串的下标混淆

  • dp[i] 代表的是前 i 个字符构成的子串(即 s[0:i]),而不是下标 i 的字符。
  • 所以判断子串是否在字典中时,要写 s[j:i],而不是 s[j:i+1]

✅ 注意 2:字典查找效率

使用 map[string]bool 构造一个哈希集合 wordSet 替代数组,可以让查找从 O(n) 降到 O(1),大幅提升效率:

wordSet := make(map[string]bool)
for _, word := range wordDict {wordSet[word] = true
}

✅ 注意 3:剪枝优化(提前结束)

只要在内层循环找到一个合法切割位置,就可以直接 break,节省无效循环。


✅ 注意 4:空字符串与空字典

  • s = "",返回 true,空字符串默认可以拆分(dp[0]=true)。
  • wordDict = [],返回 false,无单词可用无法拼出。

🌈 图解理解

假设输入:

s = "applepenapple"
wordDict = ["apple", "pen"]

我们依次维护 dp 状态:

i子串 s[0:i]能否拆分dp[i]
0“”true
5“apple”true
8“applepen”true
13“applepenapple”true

🧠 更深层的理解(背后的思想)

本题其实可以抽象为:

把一个字符串切成若干段,看这些段是否全都能在字典中找到。

也可以类比为:

一个人从字符串左端起跳,只能跳到在字典中出现的词结尾位置,问能否跳到终点。

所以动态规划是处理“前缀是否可达”这种问题的最优解。


⏳ 复杂度分析

类型复杂度
时间复杂度O(n²)
空间复杂度O(n)
  • n 是字符串长度。
  • 时间复杂度主要来自两层循环和切片操作。
  • 使用哈希集合加速查找操作。

🧠 解题思路二:记忆化搜索(DFS + 记忆化)

从起始位置出发,尝试所有可能的切割位置,只要有一个可行就返回 true

为了防止重复计算,使用 map[int]bool 进行记忆。


💻 Go 实现代码(记忆化 DFS)

func wordBreak(s string, wordDict []string) bool {wordSet := make(map[string]bool)for _, word := range wordDict {wordSet[word] = true}memo := make(map[int]bool)var dfs func(int) booldfs = func(start int) bool {if start == len(s) {return true}if val, ok := memo[start]; ok {return val}for end := start + 1; end <= len(s); end++ {if wordSet[s[start:end]] && dfs(end) {memo[start] = truereturn true}}memo[start] = falsereturn false}return dfs(0)
}

🔍 两种方法对比

方法优点缺点
动态规划性能稳定,逻辑清晰,适合面试高频实现上可能略显冗长
记忆化 DFS更贴近人类思考方式,递归直观有栈溢出风险,依赖剪枝优化

✅ 总结

  • 本题是经典的字符串 + 动态规划题型。
  • 动态规划和记忆化搜索都值得掌握!
  • 实际编码中推荐使用动态规划,执行效率更高。

🎁 加分思考

  • 如果要求输出所有可能的拆分方式?
  • 如果字典非常大,如何优化查找?(使用 Trie 前缀树)

🌟 更多高频算法题持续更新中…

欢迎点赞 👍、收藏 ⭐、评论 💬、关注 🧠,支持我继续输出优质 LeetCode 题解!💻📘📌


http://www.dtcms.com/wzjs/378948.html

相关文章:

  • 怎么查网站备案的公司网络软文推广网站
  • 2008服务器做网站seo网站优化建议
  • 申请一个网页要多少钱seo优化标题
  • 拼多多卖网站建设制作网站要多少费用
  • 网站做快照免费的企业黄页网站
  • 仿腾讯网站源码网络营销技巧培训班
  • php网站开发 远程自己可以做网站推广吗
  • 微信朋友圈网站广告怎么做外贸快车
  • 无锡网站排名哪里有seo的优化方案
  • 镇江网站制作公司网页设计一般用什么软件
  • 网站选项卡代码百度上海总部
  • 关于建设饮食与健康网站的意义免费推广网站大全
  • 沂水建设局网站整合营销活动策划方案
  • wordpress live-calendar关键词优化营销
  • 用七牛做网站外贸网站seo优化
  • 深圳优化网站网络推广公司方案
  • wordpress微信设置seo怎么发布外链
  • 公司网站建设方案书业务推广方式
  • 做服装最好的网站百度一下首页网页
  • 佛山市城乡住房建设局网站网络营销概念是什么
  • java网站开发思维导图全球新闻最新消息
  • 云南网警在线报警郑州seo技术服务
  • flash 的网站宁波靠谱营销型网站建设
  • 平台推广方案设计思路青岛seo外包服务
  • 怎么建设一个公司网站交换神器
  • 厦门做企业网站张家港seo建站
  • 珠海网站建设培训学校百度竞价排名价格
  • 网站推广品牌网络域名
  • 做新闻网站数据南昌seo数据监控
  • 金华企业做网站百度seo软件优化