【算法刷题】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.mfbz.cn/a/469314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于Ansible的模块 ①

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 什么是Ansible模块 在Linux中&#xff0c;bash无论是在命令行上执行&#xff0c;还是在bash脚本中&#xff0c;都需要调用cd、l…

MySQL最实用面试题(2024-3-14持续更新中)

MySQL篇面试题 一、介绍 ​ 这是由小龙同学自己总结领悟的mysql面试题的解析&#xff0c;也是面试宝典 二、题目 1.数据库三大范式&#xff1a; –作用&#xff1a; ​ 使表结构清晰&#xff0c;减少数据冗余&#xff08;简单讲就是重复&#xff09;&#xff0c;提高查询…

Stable Diffusion + Segment Anything试用

安装 从continue-revolution/sd-webui-segment-anything安装插件分割模型下载后放到这个位置&#xff1a;${sd-webui}/extension/sd-webui-segment-anything/models/sam下&#xff0c;可以下载3个不同大小的模型&#xff0c;从大到小如下&#xff1a;vit_h is 2.56GB, vit_l i…

test测试类-变量学习

test测试类 作用&#xff1a;标记到类上成为测试类&#xff0c;标记到方法上成为测试方法 变量&#xff1a;测试类的变量&#xff0c;在测试类括号中应用 1、invocationCount变量 意思是这个方法应该被调用的次数。 在测试框架中&#xff0c;特别是当使用参数化测试或数据驱动…

游戏陪玩系统约玩系统交友系统功能介绍

游戏约玩系统是一个集动态社交、语聊交友、线上约玩、线下活动以及购物商城等功能于一体的综合性平台。以下是该系统的功能介绍&#xff1a; 一、首页 热门大神&#xff1a;展示平台上最受欢迎的玩家&#xff0c;方便用户快速找到高水平的游戏伙伴。附近大神&#xff1a;基于…

openGauss学习笔记-246 openGauss性能调优-SQL调优-经验总结:SQL语句改写规则

文章目录 openGauss学习笔记-246 openGauss性能调优-SQL调优-经验总结&#xff1a;SQL语句改写规则246.1 使用union all代替union246.2 join列增加非空过滤条件246.3 not in转not exists246.4 选择hashagg246.5 尝试将函数替换为case语句246.6 避免对索引使用函数或表达式运算2…

Android 系统如何添加开机自启动 Shell 脚本

添加开机自启动 Shell 脚本 很多时候&#xff0c;我们想在系统启动的时候干一些“私活”&#xff0c;这个时候&#xff0c;我们就可以添加开机自启动的脚本来完成。下面我们介绍一个简单的示例&#xff1a; 在 device/Jelly/Rice14 目录下添加如下的文件与文件夹&#xff1a;…

RPC 和 序列化

RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口&#xff0c; 包含kvserver功能的一对一映射&#xff1a;Get/PutAppend&#xff0c;通过stub对象——raftKVRpcProctoc:…

HarmonyOS NEXT应用开发—图片压缩方案

介绍 图片压缩在应用开发中是一个非常常见的需求&#xff0c;特别是在处理用户上传图片时&#xff0c;需要上传指定大小以内的图片。目前图片压缩支持jpeg、webp、png格式。本例中以jpeg图片为例介绍如何通过packing和scale实现图片压缩到目标大小以内。 效果图预览 使用说明…

Catmull-Rom P5 ThreeJs与前端

文章目录 问题Echarts 3D如何让曲线变得平滑&#xff1f;Echarts 2D图中平滑效果是如何实现的&#xff1f;如何在一个Echarts 3D图中画一个圆圈&#xff1f;如何在Echarts 3D图中画一个立方体&#xff1f; Catmull-Rom插值算法先来回答第二个问题回到第一个问题在Echarts 3D图中…

运维安全管理与审计系统(堡垒机)

一、什么是运维安全管理与审计系统 运维安全管理与审计系统&#xff08;俗称 “堡垒机”&#xff09;&#xff1a;是采用新一代智能运维技术框架&#xff0c;基于认证、授权、访问、审计的管理流程设计理念&#xff0c;实现对企事业IT中心的网络设备、数据库、安全设备、主机系…

Zustand极简的状态管理工具

介绍 一个小型、快速且可扩展的 Bearbones 状态管理解决方案。 Zustand 有一个基于 hooks 的舒适 API。它不是样板文件或固执己见&#xff0c;但有足够的惯例来明确和类似通量。 zustand官网 zustand使用方法及调试工具的安装使用 安装包 npm install zustand2.创建store仓…

【Unity投屏总结】投屏方案总结

【背景】 想方便自己在VR中工作&#xff0c;打算做一个能够挂多个屏幕的远程控制VR桌面。研究下来发现细分场景有很多&#xff0c;有点鱼和熊掌不可兼得的意味&#xff0c;细分如下。 【投屏场景与解决方案】 希望多人能够同时观看我的屏幕&#xff0c;也就是一屏投多屏&…

K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)

问题描述&#xff1a; 对于这类问题的解决思路应该都差不多&#xff0c;本文以calico插件安装为例&#xff0c;发现有个Pod的镜像没有pull成功 第一步&#xff1a;查看这个pod的描述信息 kubectl describe pod calico-node-t9rql -n kube-system从上图发现是docker拉取"…

实体门店运营方案模板与策划技巧:轻松打造高效运营体系

在当今竞争激烈的商业环境中&#xff0c;实体门店的运营如同一场精密谋划的战役&#xff0c;需要精心策划和高效管理才能在市场中崭露头角。作为经营鲜奶吧5年时间的创业者&#xff0c;我深知成功的实体门店背后离不开一套完善的运营方案和策略。 在这篇文章中&#xff0c;我将…

基于java的宠物信息交流平台设计(含源文件)

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的“多鱼”旧物交易平台。当前的信息管理存在工作…

精酿啤酒:一口啤酒,一份享受

在繁华的都市生活中&#xff0c;我们总是匆匆忙忙&#xff0c;追求着各种目标和成就。然而&#xff0c;在这个过程中&#xff0c;我们往往忽略了生活的本质&#xff0c;那就是享受。而Fendi Club 啤酒&#xff0c;正是为那些追求品质生活的都市精英们量身打造的。 Fendi Club啤…

Java多线程自定义线程池——线程池的七大参数和四大拒绝策略

线程池 2.1 线程池思想 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统…

Claude3介绍

英文介绍链接&#xff1a;Introducing the next generation of Claude \ Anthropic Anthropic这家由OpenAI分裂出去的兄弟公司&#xff0c;悄无声息地、低调地将Claude3推出了 免费版claude 3 sonnet使用网站&#xff08;国内镜像站&#xff09;&#xff1a;Claude 3 AI&…

106 基于消息队列来做 mysql 大数据表数据的遍历处理

前言 最近有这样的一个需求, 我们存在一张 很大的 mysql 数据表, 数据量大概是在 六百万左右 然后 需要获取所有的记录, 将数据传输到 es 中 然后 当时 我就写了一个脚本来读取 这张大表, 然后 分页获取数据, 然后 按页进行数据处理 转换到 es 但是存在的问题是, 前面 还…