力扣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://www.mzph.cn/news/749773.shtml

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

相关文章

深入浅出 Spring:核心概念和基本用法详解

个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1b;《Java》 一、引言 在 Java 企业级应用开发中&#xff0c;Spring 框架已经成为了事实上的标准。它提供了一种轻量级的解决方案&#xff0c;使得开发者能够更轻松地构建灵活、可扩展的应用程序。在本文中&#xff0c…

基于springboot+vue实现艺术水平考级报名系统【项目源码+论文说明】计算机毕业设计

基于springbootvue实现艺术水平考级报名系统演示 摘要 本次毕业设计基于SpringBoot框架开发了一款艺术水平考级报名管理系统。该系统为考生提供了线上报名、准考证管理等核心功能&#xff0c;并为系统管理员提供了在线发布考试信息、对报名考生进行审核等管理功能。通过该系统…

每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录 力扣714. 买卖股票的最佳时机含手续费 状态机分析 解析代码 力扣714. 买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 难度 中等 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续…

ffmpeg6.0从demux_decode.c源码探索解封装流程

前言 在播放器的播放视频、音视频媒体文件的推流等实际应用中,解封装(demux)这个操作是不可避免的,也是最基础的操作。 拿播放器播放MP4来说,如果想实现播放器视频画面的播放和音频声音的播放都需要经过这个解封装的步骤。因为MP4是一种媒体文件格式,是一种封装格式,M…

快速高效地数据分析处理:QtiPlot for Mac中文直装版 兼容M

QtiPlot 是一个用于数据分析和可视化的跨平台科学应用程序。由于其多语言支持&#xff0c;QtiPlot 被积极用于世界各地学术机构的教学。许多研究科学家信任 QtiPlot 来分析他们的数据并发布他们的工作结果。来自各个科学领域和行业的数千名注册用户已经选择了 QtiPlot 来帮助他…

一文全面了解向量数据库

1. 什么是向量数据库&#xff1f;** 首先&#xff0c;我们需要理解什么是向量&#xff1f; 向量是基于不同特征或属性来描述对象的数据表示。每个向量代表一个单独的数据点&#xff0c;例如一个词或一张图片&#xff0c;由描述其许多特性的值的集合组成。这些变量有时被称为“…

C/C++火柴棍等式

有n根(n<24)火柴棍&#xff0c;你可以拼出多少个形如“ABC"的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零&#xff0c;则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 依次需要用到的火柴棍数目为6 2 5 5 4 5 6 3 7 6 。 如果是初学者可能会这么写。 …

数据结构:基于数组实现简单的数据缓存区(简单队列)

1 前言 在我们使用CAN或者以太网调试时&#xff0c;经常需要缓存最近n次收到的数据&#xff0c;以便于我们对数据进行分析。 实现这一想法我们很容易就会想到队列&#xff0c;队列就是一种先进先出的数据结构&#xff0c;之前在《数据结构&#xff1a;基于数组的环形队列&…

最新最全智能科学与技术专业毕业设计选题精华汇总-持续更新中

文章目录 0 简介1 如何选题2 最新智能科学与技术毕设选题3 最后 0 简介 Hi&#xff0c;大家好&#xff0c;随着毕业季的临近&#xff0c;许多同学开始向学长咨询关于选题和开题的问题。在这里&#xff0c;学长分享一些关于智能科学与技术专业毕业设计选题的内容。 以下为学长…

人大金仓大小写敏感处理

人大金仓安装的时候&#xff0c;不管是否选择大小写敏感&#xff1b;查询的时候加和不加双引号&#xff0c;查询出来的都是小写 针对人大金仓大小写&#xff0c;我们实际引用全是大写的情况&#xff0c;解决方案如下 添加配置&#xff0c;将查询结果全都转成大写 1、本地打开…

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

SpringBoot3整合mybatis

SpringBoot3整合mybatis 一、添加mybatis的依赖二、通过XML配置三、通过yum或properties文件配置四、常用注解1.Mapper2.MapperScan 一、添加mybatis的依赖 <!--mybatis--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>…

简单的网页制作

1网页编写格式 <!DOCTYPE html> <html><head><meta charset"utf-8"> <title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html>2标签 在body内<h1></h1&…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下&#xff1a; 弹幕轮播组件&#xff1a;BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化&#xff0c;包括&#…

Java代码基础算法练习-判断字符串是否为回文-2024.03.16

任务描述&#xff1a; 回文串是指一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等。要求输入 一个字符串&#xff0c;判断此字符串是否为回文。&#xff08;注&#xff1a;设字符串长度小于20&#xff09; 任务要求&#xff1a; package suanfa;import…

Vue:内置组件:KeepAlive(缓存组件实例)

一、作用 <KeepAlive></KeepAlive>能缓存包裹的所有组件&#xff0c;保证组件在切换时维持组件状态。 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建一个只带有初…

部署一个本地的ChatGPT(Ollama)

一 下载Ollama Ollama下载地址&#xff1a;https://ollama.com/download 下载完后 二 安装运行 双击下载好的OllamaSetup.exe开发 安装Ollama: 安装完成后&#xff0c;多了一个Ollama的菜单如下图 &#xff1a; Ollama安装好默认是配置开机运行&#xff0c;如果没有运行可以在…

MyBatis plus自动生成代码

1.pom文件配置 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version> </dependency> <dependency><groupId>com.baomidou</groupId>…

第五十九回 公孙胜芒砀山降魔 晁天王曾头市中箭-飞桨自然语言处理套件PaddleNLP初探

公孙胜献出八卦阵&#xff0c;宋江用八员大将守阵。项充李衮进入阵里&#xff0c;被抓住了。宋江说久闻大名&#xff0c;来梁山吧。两人说誓当效力到死&#xff0c;希望能先放我们两个回去把樊瑞带来一起。见到樊瑞后把宋江讲义气一说&#xff0c;樊瑞说不可逆天&#xff0c;于…

力扣112、113、101--树

112. 路径总和 题目描述&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。 判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c…