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

北京市网站公司网站武进网站建设咨询

北京市网站公司网站,武进网站建设咨询,高校档案室网站建设,网站开发入职转正申请书算法-动态规划/trie树-单词拆分 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/word-break/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 动态规划 2.1 解题思路 dp[i]表示[0, i)字符串可否构建那么dp[i]可构建的条件是&…

算法-动态规划/trie树-单词拆分

1 题目概述

1.1 题目出处

https://leetcode.cn/problems/word-break/description/?envType=study-plan-v2&envId=top-interview-150

1.2 题目描述

在这里插入图片描述

2 动态规划

2.1 解题思路

  1. dp[i]表示[0, i)字符串可否构建
  2. 那么dp[i]可构建的条件是,[0,j)可构建且[j,i)包含在wordDict中
  3. 这里你可能会问,那如果是[j,i)不能直接构建,而是有wordDict种的两个单词构建怎么办?其实,因为我们是从低到高构建的动态规划,所以设k > j 且 k <i,那么dp[k] = true,因为dp[j]=true且 [j,k)在wordDict中。那么 [k, i)就是剩下的那个单词了,所以 [j,i)也可以被构建。

2.2 代码

class Solution {public boolean wordBreak(String s, List<String> wordDict) {// dp[i]表示[0, i)字符串可否构建// 那么dp[i]可构建的条件是,[0,j)可构建且[j,i)包含在wordDict中boolean[] dp = new boolean[s.length() + 1];dp[0] = true;Set<String> set = new HashSet<>(wordDict);for (int i = 1; i <= s.length(); i++) {for (int j = 0; j < i; j++) {if (dp[j] == true && set.contains(s.substring(j, i))) {dp[i] = true;break;}}}return dp[s.length()];}
}

2.3 时间复杂度

O(c*s.length)
在这里插入图片描述

2.4 空间复杂度

O( s.length)

3 trie树

3.1 解题思路

  1. 将wordDict构建trie树
  2. 将s从位置0开始往后匹配查找
  3. 如果当前位置能匹配上,继续判断是否是单词结尾,如果是且下一个单词开始的匹配也能成功,就说明能构建,返回true
  4. 其他情况继续往后匹配

3.2 代码

class Solution {Trie root = new Trie();// 记忆数组,用来快速判定该位置是否可以作为单词结尾进行拆分构建boolean[] no = new boolean[300];public boolean wordBreak(String s, List<String> wordDict) {// 将所有word插入字典树for (String word : wordDict)root.insert(word);// 从0个字符开始往后查找,只要匹配成功说明可以构建目标字符串if (root.find(s, 0)) {return true;}return false;}class Trie{public Trie[] children = new Trie[26];// 当前child代表的字符是否是单词结尾boolean isEnd = false;public void insert(String word) {if (null == word || word.length() == 0) {isEnd = true;return;}int index = word.charAt(0) - 'a';Trie child = children[index];if (null == child) {child = new Trie();children[index] = child;}child.insert(word.substring(1));}public boolean find(String s, int i) {// 快速判定当前字符位置是否可以拆分构建// 注意这里必须判定当前节点是否是root,因为我们缓存是从根节点开始的// 否则会对其他child的正常判断过程造成误判if (this == root && no[i]) {return false;}char firstC = s.charAt(i);Trie child = children[firstC - 'a'];if (null == child) {// 如果不能匹配指定位置字符,肯定不可构建if (this == root) {no[i] = true;}return false;}if (child.isEnd) {// 如果能找到目标字符,且字符是单词结尾if (i + 1 == s.length()) {// 如果// 1.已经扫描到字符串最后的字符// 就说明当前位置可以用来拆分构建目标字符串return true;} else {if (root.find(s, i+1)) {// 如果下一个字符往后的字符串能构建// 就说明当前位置可以用来拆分构建目标字符串return true;} else {// 否则说明i+1字符虽是单词结尾,但无法直接拆分构建,记录下来no[i+1] = true;}}}if (i + 1 < s.length()) {// 还未到结尾,可以继续往后查找return child.find(s, i+1);} else {// 已到单词结尾,构建失败return false;}}}
}

3.3 时间复杂度

在这里插入图片描述

3.4 空间复杂度

O(s.length)

参考

  • 循序渐进5种解法,从字典树trie回溯延伸到动态规划
http://www.yayakq.cn/news/427713/

相关文章:

  • 网站前台后台模板下载企业网站的常见服务是什么
  • 台州网站怎么推广网站开发的几个步骤
  • 2016网站设计规范周口网站设计
  • 湖南做旅游网站进口博览会2022上海
  • 免费网站域名申请某网站项目策划书
  • 网站开发技术支持在线作图软件
  • 找做网站技术人员沈阳网站建设方案报价
  • 郑州网站建设公司排行榜wordpress 嵌入百度地图
  • 电子政务服务网站建设湖北 网站 备案 时间
  • 做水果代理去哪个网站自己怎么做网站购买空间
  • 网站做程序需要多久wordpress nginx 302
  • 试述建设一个网站的具体步骤wordpress 图片显示不了
  • 六安网站制作公司排名腾讯云wordpress优化
  • 网站开发公司多少钱江门网站推广软件
  • 做个网站做什么呢福州市建设局网站
  • 淄博网站制作企业高端全面加强基层基础建设
  • 单位门户网站可以做百度百科wordpress图片懒加载js
  • asp网站域名授权网站海外推广建设
  • 做网站最烂公司自己做的网站 怎么在网上销售
  • 江西网站建设费用免费网站百度收录
  • 学网络营销网站建设好吗怎么建设一个营销型网站
  • 南昌电商购物网站开发网站 设计理念
  • 提供小企业网站建设南京网络科技公司有哪些
  • 临沂做网站的公司网推软件有哪些
  • 对接公众号的网站怎么做设计一套vi的报价
  • 做的网站怎么放到域名门户网站开发需求文档
  • 网站建设的五类成员网站维护更新费用
  • 响应网站怎么做教学视频大连网络推广宣传
  • 小企业网站建设流程帮网站做关键词排名优化
  • spring框架做网站山东建设机械协会官方网站