力扣L13--- 409.最长回文串(JAVA版)-2024年3月1日

1.题目描述

在这里插入图片描述

2.知识点

注1:向下取整是将一个数值向下舍入到最接近的整数,但不超过这个数值的整数。具体规则如下:

对于正数,向下取整后得到的整数是不大于原数值的最大整数;
对于负数,向下取整后得到的整数是不小于原数值的最大整数。
例如:
在这里插入图片描述

注2:toCharArray() 是 Java 中 String 类的一个方法,它的作用是将字符串转换为字符数组。
例如,假设有一个字符串 s = “hello”,调用 s.toCharArray() 将返回一个字符数组 [‘h’, ‘e’, ‘l’, ‘l’, ‘o’],其中每个字符对应字符串 s 中的一个字符。

注3:count.getOrDefault(c, 0) 是 Java 中 HashMap 类的方法,它的作用是获取哈希表中指定键的值,如果该键不存在,则返回指定的默认值。
如果哈希表中存在键 c,则返回键 c 对应的值。
如果哈希表中不存在键 c,则返回默认值 0。
语法:

V getOrDefault(Object key, V defaultValue)

其中,key 是要查找的键,defaultValue 是默认值。

在这个问题中,我们使用 count.getOrDefault(c, 0) 来获取每个字符在哈希表中的出现次数。如果字符 c 在哈希表中存在,则返回对应的出现次数;如果不存在,则返回默认值 0,表示该字符还没有出现过。
注4:我们首先将 hasOdd 初始化为 false,因为我们一开始不知道字符串中是否存在出现次数为奇数的字符。然后在统计每个字符的出现次数时,如果发现有某个字符出现的次数是奇数,则将 hasOdd 设置为 true。这样在遍历完字符串后,我们就能根据 hasOdd 的值确定是否存在出现次数为奇数的字符。

因此,将 hasOdd 初始值设为 false 是为了在开始时保持一个初始状态,并在遍历字符串时根据情况更新它的值。

**注5:**调用 cnt.values() 方法会返回一个包含 cnt 中所有值的集合,这个集合的类型是 Collection,其中 V 是哈希表中值的类型。在这个问题中,cnt 中的值是整数类型,因此 Collection 的类型是 Collection。
通过调用 cnt.values() 方法,我们可以获取到 cnt 哈希表中所有字母的出现次数,这些出现次数存储在一个集合中,我们可以通过遍历这个集合来获取每个字母的出现次数。
现在我们调用 cnt.values() 方法,将返回一个包含哈希表 cnt 中所有值的集合。在这个例子中,集合中的元素是整数,表示每个字母的出现次数。因此,集合中的元素是 {3, 2, 1}。

HashMap<Character, Integer> cnt = new HashMap<>();
cnt.put('a', 3); // 'a' 出现了 3 次
cnt.put('b', 2); // 'b' 出现了 2 次
cnt.put('c', 1); // 'c' 出现了 1 次
for (int charCnt : cnt.values()) {System.out.print(charCnt+" "); // 输出每个字母的出现次数
}
//输出3  2  1

3.思路与具体例子

假设我们有输入字符串 s = “abccccdd”。
(1)统计每个字母出现的次数: 我们需要统计每个字母出现的次数。使用哈希表来记录每个字母出现的次数,对于示例字符串,统计结果如下:

{'a': 1, 'b': 1, 'c': 4, 'd': 2}

(2)构造回文串的过程:

对于出现偶数次的字母,我们可以将其全部添加到回文串中,因为它们可以完全对称地构成回文串的一半。
对于出现奇数次的字母,我们只能取其偶数部分,因为回文串是对称的,如果将所有奇数次的字母都添加到回文串的两端,将无法构成一个对称的回文串。但我们可以选择其中一个字母放在回文串的中心。
(3)计算回文串的长度:
1)对于偶数次出现的字母,直接将其出现次数添加到回文串长度中。
2)对于奇数次出现的字母,取其偶数部分,即将其除以 2 后向下取整再乘以 2,然后将结果添加到回文串长度中。

当一个字母出现的次数是奇数时,我们只能取其偶数部分来构造回文串。我们需要将这个奇数次出现的字母数量减少到偶数。
具体做法是,将这个奇数次出现的字母数量除以 2 后取整,然后再乘以 2。这样得到的结果就是比原始奇数次出现的数量小的最大的偶数。

3)如果存在出现次数为奇数的字母,最后回文串长度加上 1。

举个例子abccccdd 总长度是8
a:1 ,b:1 ,c=4, d=2
因为a是奇数,所以1/2=0.5 ,向下取整是0,02=0
因为b是奇数,所以1/2=0.5,向下取整是0,0
2=0
因为存在过 次数为奇数的字母,所以要把回文串的总长度+1(意思也就是说偶数的全加进去,奇数不管是a还是b,你挑一个放在回文串的中间就可以)
所以4+0+0+2+1=7

(4)计算回文串的长度:

4 + 2 + 1 = 7

最长回文串的长度为 7,例如 “dccaccd”。

4.代码实现

class Solution {public int longestPalindrome(String s) {int length=0;//会文创的总长度;boolean oddChar=false;//是否存在字数为奇数的字母//构造一个空的哈希表,用来存储每个字母出现的字数HashMap<Character,Integer> cnt=new HashMap<>();//s.toCharArray()将字符串变成字符数组// cnt.getOrDefault(c, 0) 是 Java 中 HashMap 类的方法,用于获取哈希表中指定键的值。如果该键存在,则返回对应的值;如果该键不存在,则返回指定的默认值。// cnt.getOrDefault(c, 0) 指定键为字符c变量 设置默认的值为0for(char c:s.toCharArray()){cnt.put(c,cnt.getOrDefault(c,0)+1);}for(int charCnt:cnt.values()){if(charCnt%2==0){length=length+charCnt;//把字母出现的是偶数次的 全部加到总串串}else{length=length+charCnt-1;//把字母出现的是奇数次的,先取到最大不超过该奇数的偶数。oddChar=true;//说明存在字母出现是奇数次的}}if(oddChar==true){return length+1;//把奇数次字母,取一个的放在串的中间}return length;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java手写简易数据库--持续更新中

MYDB 0. 项目结构0.1 引用计数缓存框架为什么不使用LRU引用计数缓存缓存框架实现 0.2 共享内存数组 1. 事务管理器--TM1.1 XID 文件XID 规则XID 文件结构读取方式事务状态 1.2 代码实现 2. 数据管理器--DM2.1 页面缓存页面结构页面缓存数据页管理第一页普通页 2.2 日志文件 3. …

一文搞懂PCL中自定义点云类型的构建与函数使用

上周猛男快乐开发时遇到个bug&#xff0c;要用pcl的函数对自定义的点云进行处理。一起解决问题时遇到了很多问题&#xff0c;解决后整理出来分享给各位参考&#xff0c;以免踩一样的坑&#x1f60a;。文章中自定义的点我用PointT来表示&#xff0c;自定义点云一般指的是pcl::Po…

西门子TIA中配置Anybus PROFINET IO Slave 模块

1、所需产品 Siemens S7 PLC CPU 315-2 PN/DP 6ES7 315-2EH-0AB0 Siemens PLC 编程电缆 n.a. n.a. PC ,并安装Siemens PLC编程软件 TIA Portal V11 X-gateway Slave 接口的GSDML文件 根据网关的软件版本而定 Anybus Communicator GSD文件 GSDML-V1.0-HMS-ABCPRT-20050317.xl…

算法耗时通用优化技巧 总结

最近在部署AI相关的算法&#xff0c;并要求减少总耗时&#xff0c;从中总结出的一些比较通用的优化技巧。精髓总结一句话就是&#xff1a;在同一时间尽可能充分利用硬件资源。而怎么尽可能充分利用呢&#xff0c;方式就是多线程并行处理。 1、单线程串行处理数据 假设算法需要…

Python中字符串知识点汇总,以及map()函数的使用

1.字符串的定义 字符串&#xff1a;字符串就是一系列字符。在python中&#xff0c;用引号括起来的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号。 2.使用方法修改字符串的大小写 ①将字符串的字母全部改为大写&#xff1a;upper()函数 实例&…

kkview远程控制: 内网远程桌面控制软件

内网远程桌面控制软件&#xff1a;高效、安全的远程管理方案 在信息技术日新月异的今天&#xff0c;内网远程桌面控制软件已成为许多企业和个人用户不可或缺的工具。这类软件允许用户通过内部网络&#xff0c;实现对其他计算机的远程访问和控制&#xff0c;从而大大提高工作效…

蓝桥杯Java准备

蓝桥杯马上就要开始了&#xff0c;话说干什么都先准备准备&#xff0c;临阵磨枪不快也光。 首先蓝桥杯java语言中使用的是eclipse的2020.06的版本&#xff0c;使用jdk1.8的版本&#xff0c;大家可以先下载下来然后体验一下。 然后就是熟悉的Helloworld环节 eclipse设置 打开几…

Linux第79步_使用自旋锁保护某个全局变量来实现“互斥访问”共享资源

自旋锁使用注意事项:自旋锁保护的“临界区”要尽可能的短。 因此&#xff0c;在open()函数中申请“spinlock_t自旋锁结构变量”&#xff0c;然后在release()函数中释放“spinlock_t自旋锁结构变量”&#xff0c;这种方法就行不通了。如果使用一个变量“dev_stats”来表示“共享…

解锁区块链游戏数据解决方案

作者&#xff1a;stellafootprint.network 随着区块链技术的日新月异&#xff0c;游戏行业正迎来一场革命&#xff0c;催生了区块链游戏的崛起。这一变革不仅为用户带来了全新的互动体验&#xff0c;也开辟了全新的盈利渠道。然而&#xff0c;在这一新兴领域&#xff0c;数据的…

多站合一的音乐搜索下载助手PHP源码l亲测

源码获取方式 回复&#xff1a;031601 搭建教程&#xff1a; 将源码下载上传至宝塔面板&#xff0c;直接运行即可~ 说明&#xff1a; 该源码进行测试&#xff0c;测试成功源码无加密优化相关其他采集问题。

html--花瓣

代码 <!DOCTYPE html> <html lang"en" ><head> <meta charset"UTF-8"> <title>Petals</title><link rel"stylesheet" href"css/style.css"></head><body><div class"…

JAVA---学生管理系统

遍历字符串 ArrayList学习&#xff1a;

Postman接口测试之断言,全网最细教程没有之一!

一、断言 在 postman 中我们是在Tests标签中编写断言&#xff0c;同时右侧封装了常用的断言&#xff0c;当然 Tests 除了可以作为断言&#xff0c;还可以当做后置处理器来编写一些后置处理代码&#xff0c;经常应用于&#xff1a; 【1】获取当前接口的响应&#xff0c;传递给…

二分/二分查找(整数二分详解+拓展浮点二分)

先上题目 在一个有序数组中&#xff0c;查找x所在的下标。 输入 第一行两个整数n和m。 第二行n个数&#xff0c;表示有序的数列。 接下来m行&#xff0c;每行一个整数x&#xff0c;表示一个询问的数。 输出 对于每个询问如果x在数列中&#xff0c;输出下标。否则输出-1 样…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

2024年腾讯云2核4G服务器够用吗?性能测评

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

第三门课:结构化机器学习项目-机器学习策略

文章目录 1 机器学习策略一1.1 为什么是ML策略&#xff1f;1.2 正交化1.3 单一数字评估指标1.4 满足和优化指标1.5 训练、开发及测试集划分1.6 开发集和测试集的大小1.7 什么时候改变开发、测试集和指标&#xff1f;1.8 为什么是人的表现&#xff1f;1.9 可避免偏差1.10 理解人…

【编程项目开源】微信飞机大战(鸿蒙版)

目标 仿微信飞机大战 效果 开发工具 下载DevEco Studio 工程截图 开源地址 https://gitee.com/lblbc/plane_game/tree/master/PlaneGame_hongmeng_ArkTS 关于 厦门大学计算机专业|华为八年高级工程师 专注《零基础学编程系列》 http://lblbc.cn/blog 包含&#xff1a;Ja…

前端Prettier 插件的使用配置(详细)

各个参数代表的意思:printWidth&#xff1a;每行代码的最大长度限制。 tabWidth&#xff1a;选项用于控制制表符的宽度。 useTabs&#xff1a;指定是否使用制表符代替空格。 semi&#xff1a;指定是否在语句的末尾添加分号。 singleQuote&#xff1a;指定是否使用单引号或双引号…

操作系统系列学习——一个实际的schedule函数

文章目录 前言一个实际的schedule函数 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感…