【算法刷题】Day32

文章目录

  • 1. 单词拆分
    • 题干:
    • 算法原理:
      • 1. 状态表示:
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 填表顺序
      • 5. 返回值
    • 代码:
  • 2. 环绕字符串中唯一的子字符串
    • 题干:
    • 算法原理:
      • 1. 状态表示:
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 填表顺序
      • 5. 返回值
    • 代码:
  • 3. 计算布尔二叉树的值
    • 题干:
    • 算法原理:
    • 代码:
  • 4. 求根节点到叶节点数字之和
    • 题干:
    • 算法原理:
    • 代码:

1. 单词拆分

在这里插入图片描述
原题链接


题干:

字符串 s 和一个字符串列表 wordDict
利用字典中出现的一个或多个单词拼接出 s 则返回 true

字典中的单词可以重复使用


算法原理:

1. 状态表示:

dp[i] 表示: [0, i] 区间内的字符串,能否被字典中的单词拼接而成

2. 状态转移方程

在这里插入图片描述
在这里插入图片描述

3. 初始化

  1. 辅助结点⾥⾯的值要「保证后续填表是正确的」
  2. 「下标的映射关系」

dp[0] = true
s = ’ ’ + s

4. 填表顺序

从左往右

5. 返回值

dp[n]


代码:

class Solution {public boolean wordBreak(String s, List<String> wordDict) {//优化:将字典里面的单词存在哈希表里面Set<String> hash = new HashSet(wordDict);int n = s.length();boolean[] dp = new boolean[n + 1];dp[0] = true;s = " " + s;//处理下标的映射关系for(int i = 1; i <= n; i++) {for(int j = i; j >= 1; j--) {if(dp[j - 1] && hash.contains(s.substring(j, i + 1))) {dp[i] = true;break;}}}return dp[n];}
}

2. 环绕字符串中唯一的子字符串

在这里插入图片描述
原题链接


题干:

字符串 base 为一个 “abcdefghijklmnopqrstuvwxyz” 无限环绕的字符串
在这里插入图片描述

给一个字符串 s ,统计并返回 s 中有多少 不同非空子串 也在base 中出现
在这里插入图片描述


算法原理:

1. 状态表示:

dp[i] 表示:以 i 位置的元素为结尾的所有子串里面,有多少个在 base 中出现过

2. 状态转移方程

在这里插入图片描述

3. 初始化

将表里面的值都初始化为 1

4. 填表顺序

从左往右

5. 返回值

这⾥不能直接返回 dp 表里面的和,因为会有重复的结果。

在返回之前,我们需要先「去重」:

  1. 相同字符结尾的 dp 值,我们仅需保留「最大」的即可,其余 dp 值对应的子串都可以在最大的里面找到
  2. 可以创建⼀个大小为 26 的数组,统计所有字符结尾的最大 dp 值

最后返回「数组中所有元素的和」即可。


代码:

class Solution {public int findSubstringInWraproundString(String ss) {int n = ss.length();char[] s = ss.toCharArray();//1. 利用 dp 得到每一个位置为结尾的最长连续数组的长度int[] dp = new int[n];for(int i = 0; i < n; i++) {dp[i] = 1;}for(int i = 1; i < n; i++) {if(s[i - 1] + 1 == s[i] || (s[i - 1] == 'z' && s[i] == 'a')) {dp[i] += dp[i - 1];}}//2. 确定返回值int[] hash = new int[26];for(int i = 0; i < n; i++) {hash[s[i] - 'a'] = Math.max(hash[s[i] - 'a'], dp[i]);}//3. 返回结果int sum = 0;for(int x : hash) {sum += x;}return sum;}
}

3. 计算布尔二叉树的值

在这里插入图片描述
在这里插入图片描述
原题链接


题干:

叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。

非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR ,3 表示逻辑与 AND 。
在这里插入图片描述


算法原理:

利用递归解决问题
在这里插入图片描述
在这里插入图片描述


代码:

class Solution {public boolean evaluateTree(TreeNode root) {if(root.left == null) {return root.val == 0 ? false : true;}boolean left = evaluateTree(root.left);boolean right = evaluateTree(root.right);return root.val == 2 ? left | right : left & right;}
}

4. 求根节点到叶节点数字之和

在这里插入图片描述
原题链接


题干:

给一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字
每条从根节点到叶节点的路径都代表一个数字

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123
计算从根节点到叶节点生成的 所有数字之和 。


算法原理:

使用递归解决问题
在这里插入图片描述

  1. 函数头
    int dfs(TreeNode* root, int preSum)
  2. 函数体
    ① ② ③ ④
  3. 递归出口
    叶子结点

代码:

class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);}public int dfs(TreeNode root, int preSum) {preSum = preSum * 10 + root.val;if(root.left == null && root.right == null) {return preSum;}int ret = 0;if(root.left != null) {ret += dfs(root.left, preSum);}if(root.right != null) {ret += dfs(root.right, preSum);}return ret;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/557396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发日记:实现APP重启逻辑,适用于热更后重启游戏进行加载

可根据合适的弹窗搭配使用重启逻辑&#xff0c;建议使用在热更包加载后使用&#xff0c;帮助部分热更后未及时生效的逻辑范围首先&#xff0c;在逻辑调用Activity类中创建一个成员变量&#xff0c;给后续逻辑接口直接使用 如下 public class MainActivity extends Activity {…

【Linux】多线程概念 | POSIX线程库

文章目录 一、线程的概念1. 什么是线程Linux下并不存在真正的多线程&#xff0c;而是用进程模拟的&#xff01;Linux没有真正意义上的线程相关的系统调用&#xff01;原生线程库pthread 2. 线程和进程的联系和区别3. 线程的优点4. 线程的缺点5. 线程异常6. 线程用途 二、二级页…

第二十八天-ES6标准入门和Flex布局

目录 1.ES6标准入门 2.ES6与JavaScript关系 3.ES6常用新特性 1.变量与常量 1.let三大特性 2.常量三大特征 2.解构赋值 1.数组解构赋值 2.对象解构赋值 3.字符串解构赋值 3.函数与箭头函数 1.函数 2.箭头函数 4.JS的面向对象编程 5.模块化 export使用 import使用…

Spring——IOC容器介绍

启动ioc容器后 1、Spring容器读取完bean配置信息&#xff08;1、XML中的bean配置信息 2、读取java类中Configuration注解配置的bean信息&#xff09;后&#xff0c;加载到Bean定义的注册表中 2、根据Bean的注册表来创建实例Bean 3、将创建好的Bean实例再放到Spring容器中&…

【Godot4.2】Rect2拓展——mRect2类

概述 Rect2存在一些问题&#xff0c;比如难以获取除position、end和center之外的其他点。虽然计算并不复杂&#xff0c;就是简单的向量加减。但每次手动计算则比较麻烦。 其实在ShapePoints静态函数库中&#xff0c;已经尝试返回矩形的四个顶点&#xff0c;用于绘制矩形。 # …

c++的学习之路:2、入门(1)

一、 C关键字 c的关键字要比c语言要多31个足足有63个&#xff0c;这里我只是了解了下每个有啥作用&#xff0c;具体使用方法以及更多的知识将在后续学习中&#xff0c;慢慢扩展使用&#xff0c;下方表格就是c的63个关键字 asmdoifreturntryautodoubleinlinetypedefdynamic_ca…

归并算法详细解析

归并排序 1945年&#xff0c;约翰冯诺依曼&#xff08;John von Neumann&#xff09;发明了归并排序&#xff0c;这是典型的分治算法的应用。归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Di…

公司系统中了.rmallox勒索病毒如何恢复数据?

早晨上班时刻&#xff1a; 当阳光逐渐洒满大地&#xff0c;城市的喧嚣开始涌动&#xff0c;某公司的员工们纷纷踏入办公大楼&#xff0c;准备开始新的一天的工作。他们像往常一样打开电脑&#xff0c;准备接收邮件、查看日程、浏览项目进展。 病毒悄然发作&#xff1a; 就在员…

Python学习:元组

Python 元组概念 Python 中的元组&#xff08;tuple&#xff09;是不可变的有序集合。它是一种数据类型&#xff0c;类似于列表&#xff08;list&#xff09;&#xff0c;但在创建后不能被修改。元组使用圆括号 () 来表示&#xff0c;其中的元素可以是任意类型&#xff0c;并且…

“洞见·智领未来——2024行业开局暨成渝(内江)服务外包产业发展大会”共商服务外包新未来新业态

3月19日-20日&#xff0c;由中国信息协会、中共内江市委、内江市人民政府指导&#xff0c;中国信息协会数字经济专委会、中共内江市东兴区委、内江市东兴区人民政府共同主办&#xff0c;鸿联九五集团、首席客户官百人会&#xff08;CCO100&#xff09;承办的“洞见 智领未来—…

Spring学习记录之注解开发

前面我们已经了解了Spring是如何创建Bean以及完成依赖注入的&#xff0c;但我们会发现&#xff0c;其似乎并没有达到简化开发的目的&#xff0c;这是因为 我们还没有接触到注解开发。 注解开发之组件 我们在要使用Bean的地方使用Comonpent&#xff08;组件&#xff09;注解&a…

Linux 文件系统:重定向、缓冲区

目录 一、重定向 1、输出重定向 2、输入重定向 3、追加重定向 4、dup2 系统调用 二、理性理解Linux系统下“一切皆文件” 了解硬件接口 三、缓冲区 1、为什么要有缓冲区? 2、刷新策略 3、缓冲模式改变导致发生写时拷贝 未创建子进程时 创建子进程时 使用fflush…