力扣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变量 设置默认的值为0
       for(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.mfbz.cn/a/462234.html

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

相关文章

STM32基础--使用寄存器点亮流水灯

GPIO 简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚&#xff0c;STM32 芯片的 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组&#xff0c;每组有 16 个引脚&#xf…

unity学习(57)——选择角色界面--删除角色2

1.客户端添加点击按钮所触发的事件&#xff0c;在selectMenu界面中增加myDelete函数&#xff0c;当点击“删除角色”按钮时触发该函数的内容。 public void myDelete() {string message nowPlayer.id;//string m Coding<StringDTO>.encode(message);NetWorkScript.get…

PCB设计中的MARKER

今天在给板子布局的时候发现了一个这样的东西&#xff0c;名叫MARKER&#xff0c;查了一下这个东西分享一下&#xff1a; 目录 MARKER是什么样的&#xff1f; MARKER的用途&#xff1a; MARKER是必须的吗&#xff1f; MARKER是什么样的&#xff1f; 他在PCB中是这样的&…

微服务:Bot代码执行

每次要多传一个bot_id 判网关的时候判127.0.0.1所以最好改localhost 创建SpringCloud的子项目 BotRunningSystem 在BotRunningSystem项目中添加依赖&#xff1a; joor-java-8 可动态编译Java代码 2. 修改前端&#xff0c;传入对Bot的选择操作 package com.kob.botrunningsy…

基于SSM SpringBoot vue办公自动化计划管理系统

基于SSM SpringBoot vue办公自动化计划管理系统 系统功能 登录注册 个人中心 员工信息管理 部门信息管理 会议管理 计划管理 行程安排管理 行程进度管理 管理员管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端…

WebGIS之实现查询地区天气并让地区高亮

一.预览>> 二.思路>> 根据搜索框的内容来进行页面视角的切换&#xff0c;对应的地区高亮&#xff0c;右边有关天气的地方实时更新&#xff0c;并且因为代码体量非常小&#xff0c;并没有选择在框架下完成。直接一个html文件搞定了&#xff0c;但实际上还是有一些坑…

如何批量获取公众号所有文章的阅读数点赞数和留言数导出excel?

如何批量获取公众号所有文章的阅读数点赞数和留言数导出excel&#xff1f;我写了个脚本批量抓取&#xff0c;导出的excel文章数据包含文章日期&#xff0c;文章标题&#xff0c;文章链接&#xff0c;文章简介&#xff0c;文章作者&#xff0c;文章封面图&#xff0c;是否原创&a…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

【模拟string函数的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 模拟string函数的实现 浅拷贝 深拷贝 vs和g下string结构的说明 总结 前言 模拟string函数的实现 浅拷贝 深拷贝 总结 前言 世上有两种耀眼的光芒&#…

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

PyQt5---初识PyQt5相关及开发实战介绍

什么是GUI GUI是Graphical User Interface&#xff08;图形用户界面&#xff09;的缩写&#xff0c;是一种用户与计算机交互的方式&#xff0c;通过使用图形化的元素&#xff08;如按钮、窗口、菜单等&#xff09;来帮助用户完成任务。GUI使得用户可以通过鼠标、键盘等输入设备…

2024.3.17 机器学习周报

引言 Abstract 文献阅读 1、题目 R-TRANSFORMER: RECURRENT NEURAL NETWORK ENHANCED TRANSFORMER 2、引言 递归神经网络长期以来一直是序列建模的主要选择。然而&#xff0c;它严重遭受两个问题&#xff1a;在捕获非常长期的依赖性和无法并行化的顺序计算过程中无能为力…

【Javascript编程实操06】1、反转数组和字符串 2、将二维数组转一维数组

前言 1、反转数组和字符串 代码&#xff1a; 实现效果&#xff1a; 2、将二维数组转一维数组 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串与数组的实操练习&#xff0c;共有2个实操&#xff0c;大家可以在实操的过程中更加深…

程序人生——Java泛型和反射的使用建议

目录 引出泛型和反射建议93&#xff1a;Java的泛型是类型擦除的建议94&#xff1a;不能初始化泛型参数和数组建议95&#xff1a;强制声明泛型的实际类型 建议96&#xff1a;不同的场景使用不同的泛型通配符建议97&#xff1a;警惕泛型是不能协变和逆变的 建议98&#xff1a;建议…

基于springboot实现小区物业管理系统项目【项目源码+论文说明】

基于springboot实现小区物业管理系统演示 摘要 随着城镇人口居住的集中化加剧 &#xff0c;传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个专门的管理系统。来提高物管的工作效率、为住户提供更好的服务。 物业管理系统运用现代化的计算机管理手段,使物业的…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的安全帽检测系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发先进的安全帽识别系统对提升工作场所的安全性至关重要。本文详细介绍了使用深度学习技术创建此类系统的方法&#xff0c;并分享了完整的实现代码。系统采用了强大的YOLOv8算法&#xff0c;并对其与YOLOv7、YOLOv6、YOLOv5的性能进行了详细比较&#xff0c;…

MySQL:视图

1. 概述 在MySQL中&#xff0c;视图&#xff08;View&#xff09;是一个虚拟存在的表&#xff0c;其内容是由查询定义的。视图本身并不包含数据&#xff0c;它只包含一条SQL查询语句&#xff08;即定义视图的SELECT语句&#xff09;。当通过视图访问数据时&#xff0c;MySQL会执…

【SpringBoot3】整合Druid数据源和Mybatis 项目打包和运行

文章目录 一、整合Druid数据源二、整合Mybatis2.1 MyBatis整合步骤2.1 Mybatis整合实践2.1 声明式事务整合配置2.1 AOP整合配置 三、项目打包和运行命令启动和参数说明 总结web 与 springboot 打包区别JDK8的编译环境 执行17高版本jar 一、整合Druid数据源 创建模块 &#xff1…

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下 1. ForeverStrongCheng/OpenCV-tutorials2. Fork -> ForeverStrongCheng/R2CNN_Faster-RCNN_TensorflowReferences 访问仓库页面&#xff0c;点击 Fork 按钮创建自己的仓库。 Fork 是将 GitHub 的某个特定仓库复制到自己…

【Python编程基础】第一节.Python基本语法(上)

文章目录 前言⼀、Python介绍二、Python环境配置三、Pycharm 书写代码四、Python基本语法 4.1 print 函数的简单使用 4.2 注释 4.3 Python 代码中三种波浪线和 PEP8 4.4 在 cmd 终端中运⾏ Python 代码 4.5 变量 4.6 数据类型 4.7 类型转换…
最新文章