LCR 167. 招式拆解 I

2024-03-07 21:12
文章标签 lcr 167 拆解 招式

本文主要是介绍LCR 167. 招式拆解 I,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解题思路:

动态规划+哈希表

dp[ j ]指的是以字符s[ j ]结尾的字符串的长度。这个字符串不能含有重复字符。

我们可以记为字符串sub[ j ], 该字符串以字符s[ j ]结尾,长度为dp[ j ]。

这样就比较好理解状态转移方程了。固定右边界 j ,同时定义从边界 j 往左侧距离最近的相同字符的索引为 i 。

以字符s[ j - 1 ]结尾的字符串记录为sub[ j - 1],其长度为dp[ j - 1 ],注意sub [ j - 1]中字符不重复。 我们看索引 j 的情况:在 j 的左侧寻找一个重复的字符s [ i ],那么索引 i 可能在字符串sub[ j - 1]的区间内,也可能在字符串sub[ j - 1]的左边界更左侧才有可能寻找到。这样就需要分两种情况考虑。

如果字符 s[ i ] 在子字符串 sub[ j − 1 ] 区间之外,也就是更左侧, 那么dp[ j - 1 ] < j - i,这种情况下,由于sub [ j - 1]中字符不重复,且当前最长,所以以s[ j ]为结尾的字符串只需要在子字符串 sub[ j − 1 ]后面接上这个字符s[ j ]就可以了,其长度dp [ j ] = dp[ j - 1 ] + 1;

如果字符 s[ i ] 在子字符串 sub[ j− 1 ] 区间之中,必然dp[ j−1 ] ≥ j − i,这种情况下,由于我们需要寻找以s[ j ]结尾且最长的字符串,那么sub[ j ]的左边界只能是 i 了,其长度 dp[ j ] = j − i 。

下面举个例子,比如“abcdbaa”,索引从0开始。 我们容易得到,当 j = 4时,以s[4]结尾字符串sub[4] = “cdb”的 长度dp[4] =3。 接下来我们看 j +1的情况。根据定义,sub[4]字符串中的字符肯定不重复,所以当 j = 5时,这时距离字符s[5]的左侧的重复字符a的索引 i = 0, 也就是说s[ 0 ]在子字符串sub[ 4 ]之外了,以s[5]结尾的字符串自然在sub[4]的基础上加上字符s[5]就构成了新的最长的不重复的子串sub[5],长度dp[5] = dp[4] + 1; 接下来我们继续看 j =6的情况,这时s[6]的左侧重复字符a的索引 i = 5,该重复字符在sub[ 5 ]中。新的最长不重复的字串sub[6]左边界以 i 结尾,长度dp[6] = j - i = 1。

abcdbaa

0123456

前置知识:

int i = dic.getOrDefault(arr.charAt(j), -1);

在dic中查找arr.charAt(j),如果存在返回索引,不存在就返回-1(第二个参数设定的值)

dic 这个名字是 “dictionary”(字典)的缩写,字典是一个常见的数据结构,允许以键-值对的形式存储和检索数据。在 Java 中,HashMap 实现了类似字典的功能,因此这里的 dic 就是被用作字典(键-值对映射)来追踪字符和他们最后一次出现的索引。

class Solution {public int dismantlingAction(String arr) {Map<Character, Integer> dic = new HashMap<>();int res = 0;int len = arr.length();int[] dp = new int[len];for (int j = 0; j < len; j++) {// 获取dic中对应键的值,即索引 iint i = dic.getOrDefault(arr.charAt(j), -1); // 更新哈希表,保证字符的索引始终在最新出现的相同字符的位置上,如babce,b的索引先是0,后是2dic.put(arr.charAt(j), j); if (j == 0) {dp[j] = 1; // 初始化dp[0]} else if (dp[j - 1] < j - i) {dp[j] = dp[j - 1] + 1; // dp[j - 1] -> dp[j]} else {dp[j] = j - i; // 新的子字符串开始的位置}res = Math.max(res, dp[j]); // 更新结果}return res; // 返回最长不重复子串的长度}
}

这篇关于LCR 167. 招式拆解 I的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784850

相关文章

深入拆解 Java 虚拟机 】Exception异常笔记

【深入拆解 Java 虚拟机 】Exception异常笔记 try-with-resource语法糖finally try-with-resource语法糖 try后对象的close方法都会被运行。 package com.exception.demo;public class Foo implements AutoCloseable {private final Strin

LCR 018

题目:LCR 018 解法:双指针 左指针指向第一个元素,右指针指向最后一个元素。两指针向中间收缩,当遇到不合法字符时跳过直到下一个合法字符 public boolean isPalindrome(String s) {int left = 0, right = s.length() - 1;while (left < right) {while (left < right &&

用简易代码拆解物联网IoT平台骨架

一、功能实现 完成平台基础数据配置,MQ服务,数据流转(网关读取设备数据,自定义报文上传,触发器判断,自定义报文下发,网关写入设备数据) JSON串转换过程 网关发送编码 {"ts":"2024-09-05T03:03:40.174Z","d":[{"tag":"40105","value":50}]}IoT接收解码 {"temperature":50}IoT触发规则(写入设备) {"

项目拆解:短视频冷门赛道—ai绘画+温馨小屋,引流变现全攻略

在这个快节奏的时代,工作、学习、家庭的重担仿佛三座大山,让人喘不过气,心情时常跌入谷底。就像蜗牛遇到威胁会缩进壳里,我们也会在疲惫和忧虑时,渴望一个属于自己的温暖小窝,来安放疲惫的心灵。而自媒体平台上,一种特别的账号悄然走红,它们如同一盏盏温暖的灯,照亮了无数人的心房。 🏠 小屋里的温柔时光 这些账号,简单却充满魔力,它们不靠华丽的辞藻,也不依赖复杂的剪辑,仅凭一张或几张精心挑选的图片,搭配

超全拆解AlphaFold 3,上海交大钟博子韬:极致利用数据,以原子精度预测所有生物分子结构,但并不完美

能够以「原子精度」预测出所有生物分子结构和相互作用的 AlphaFold 3,一经面世便引起了业界的广泛讨论。8 月 13 日,在上海交通大学 AI for Bioengineering 暑期学校活动中,钟博子韬博士以「AlphaFold 3:原理,应用与展望」为题,系统性地梳理了他的学习心得,并广泛整理了来自科研界的众多相关研究成果,向大家分享了他对于 AlphaFold 3 的深刻洞察, Hy

【CSP】坐标变换2(问题拆解,快速输入,知识补充)

1. 题目背景与任务分析 题目背景 本题要求对二维平面上的点进行指定角度的旋转,并输出旋转后的坐标,要求精确到小数点后六位。这类题目广泛用于考察选手对数学计算、坐标变换以及编程语言中浮点数处理的能力。 任务明确 输入:多个坐标点及旋转角度。输出:旋转后的新坐标,精确到小数点后六位。 分析与难点 几何计算:利用旋转矩阵进行坐标变换。精度控制:确保输出结果满足精度要求,避免浮点数误差。高效输

AI赚钱成功案例|像素级拆解一键生成提示词 文生图 图生视频

本文背景 之前弄了个诗词转画面大师,就是你给个句子,它就能给你画面提示词,接着用 AI 绘图软件能生成很棒的画面,再把图片弄成视频,最后能出个不错的作品。 最近看到那些漫剪大师的作品,配的歌好听,画面美,涨粉超厉害,可我们找不到那么多能漫剪的素材,能不能让 AI 生成呢?答案当然有,今天就给大家讲讲。 一、提示词的撰写 首先把诗词转画面大师的咒语升级成歌词转画面大师,今天不想手动,全交给

家具大卖nouhaus独立站拆解丨出海笔记

今天我们分析下一家传统外贸起家的大卖独立站:www.nouhaus.com 品牌背景是恒林股份(A股603661)旗下,算是有上市公司支持了。据资料显示:恒林股份成立于1998年,一年能卖出1000万+件的办公椅和沙发,实力还是很牛的。 这种品类,按我对广东这边的家居大卖的研究,大部分都是2B起家,然后依赖亚马逊等平台放量,有的甚至是VC。 但无论是要实现国际品牌化,还是要降低对平台

【CSP】因子化简_(问题分析,过程拆解,方案构建)

一、问题背景与任务概述 在因子化简问题中,我们需要对给定的多个整数进行质因数分解,并根据题目要求的条件,计算出特定的因子并输出。这类问题在编程竞赛中十分常见,尤其是涉及大数处理时,如何高效地进行质因数分解并输出结果是一个关键点。 任务: 对每个输入的整数 n 进行质因数分解。根据质因数的分解结果,计算并输出满足条件的因子。 本文将通过详细的代码注释,逐步讲解如何实现这一任务,并分析其中的关

【CSP】阴阳龙_(拆解问题,构建方案,思考发散)

1. 问题背景与任务概述 背景:在题目中,我们面临一个庞大的遗迹群,神兽“阴阳龙”在其中移动。当阴阳龙现身时,遗迹中的员工可能会因阴阳龙的力量被移动到新的位置。任务的目标是模拟阴阳龙多次现身后,所有员工最终的位置,并通过这些位置计算出一个最终的异或值。 任务:核心任务是根据阴阳龙的现身位置及方向,计算出员工的新位置,并最终计算异或值。这涉及大量的二维坐标变换及判断操作。 2. 总任务划分