LeetCode题练习与总结:最长回文串--409

news/2024/11/23 18:42:21/

一、题目描述

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。

在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串

示例 1:

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:

输入:s = "a"
输出:1
解释:可以构造的最长回文串是"a",它的长度是 1。

提示:

  • 1 <= s.length <= 2000
  • s 只由小写 和/或 大写英文字母组成

二、解题思路

  1. 首先,我们需要统计字符串中每个字符出现的次数。
  2. 对于每个字符,如果它的出现次数是偶数,那么我们可以将所有的这些字符都用于构造回文串。
  3. 如果某个字符的出现次数是奇数,那么我们可以使用其中的偶数部分(即次数减一)来构造回文串,并且我们可以选择一个字符作为回文串的中心(如果还没有选择中心字符的话)。
  4. 最后,我们将所有偶数出现次数的字符的总数加上一个可能的中心字符(如果存在的话)的个数,就是可以构造的最长回文串的长度。

三、具体代码

class Solution {public int longestPalindrome(String s) {// 用于统计字符出现次数的数组,大小为128,足以覆盖ASCII码中的所有大写和小写字母int[] count = new int[128];for (char c : s.toCharArray()) {// 统计每个字符出现的次数count[c]++;}int result = 0;boolean hasOdd = false; // 用于标记是否已经有一个奇数出现次数的字符被用作中心字符for (int val : count) {// 如果字符出现次数是偶数,则全部加入结果if (val % 2 == 0) {result += val;} else {// 如果字符出现次数是奇数,则加入偶数部分,并标记存在奇数result += val - 1;hasOdd = true;}}// 如果存在奇数出现次数的字符,则可以在回文串中心放置一个字符if (hasOdd) {result++;}return result;}
}

这段代码首先统计了每个字符的出现次数,然后计算了可以构成的最长回文串的长度,最后返回这个长度。在计算过程中,如果遇到出现次数为奇数的字符,则将偶数部分加到结果中,并标记可以放置一个中心字符。如果所有字符的出现次数都是偶数,则直接返回所有字符的总数。如果至少有一个字符的出现次数是奇数,则在最后的结果上加一,表示可以放置一个中心字符。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 统计字符出现次数的循环:我们遍历了字符串 s 中的所有字符,假设字符串的长度为 n,则这一步的时间复杂度为 O(n)。

  • 遍历统计数组 count 的循环:由于 count 的大小是固定的,为128(ASCII码中大小写字母的数量),因此这一步的时间复杂度为 O(1),可以认为是常数时间复杂度。

综合以上两步,整体的时间复杂度为 O(n),其中 n 是字符串 s 的长度。

2. 空间复杂度
  • 统计字符出现次数的数组 count:这是一个大小为128的固定大小的数组,因此这一步的空间复杂度为 O(1),可以认为是常数空间复杂度。

  • 变量 result 和 hasOdd:这些是几个基本数据类型的变量,它们占用的空间是固定的,因此这一步的空间复杂度也是 O(1)。

综合以上两步,整体的空间复杂度为 O(1),即算法使用了固定大小的额外空间,与输入字符串的长度无关。

五、总结知识点

  1. 字符数组统计:使用一个固定大小的数组 count 来统计字符串中每个字符出现的次数。数组的索引对应字符的ASCII码值,而数组的值则是对应字符出现的次数。

  2. 遍历字符串:使用增强型 for 循环(for-each 循环)来遍历字符串中的每个字符。

  3. ASCII码:代码中使用的数组大小为128,这是因为ASCII码表中的字符总数为128,包括了所有的大写和小写英文字母以及一些特殊字符。

  4. 取模运算:使用 % 运算符来检查一个数字是否为偶数,即 val % 2 == 0

  5. 逻辑判断:使用 if-else 语句来根据字符出现次数的奇偶性来决定如何累加到结果中。

  6. 布尔变量:使用布尔变量 hasOdd 来标记是否有字符的出现次数为奇数,这个标记用于最后决定是否可以在回文串中心放置一个字符。

  7. 整型累加:使用整型变量 result 来累加可以构成回文串的字符数量。

  8. 数组遍历:使用增强型 for 循环来遍历 count 数组,以统计可以构成回文串的字符数量。

  9. 条件语句:在最后,使用 if 语句来检查 hasOdd 变量,如果为 true,则在结果中加一,表示可以放置一个中心字符。

  10. 方法返回值:使用 return 语句来返回最终计算出的最长回文串的长度。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.ppmy.cn/news/1549344.html

相关文章

国土安全部发布关键基础设施安全人工智能框架

美国国土安全部 (DHS) 发布建议&#xff0c;概述如何在关键基础设施中安全开发和部署人工智能 (AI)。 https://www.dhs.gov/news/2024/11/14/groundbreaking-framework-safe-and-secure-deployment-ai-critical-infrastructure 关键基础设施中人工智能的角色和职责框架 https:/…

springmvc 用了 @RequestMapping 是不是可以不用

springmvc 用了 RequestMapping 是不是可以不用 Controller 关系 RequestMapping 是用来映射请求的&#xff0c;可以注解在类或方法上。当注解在类上时&#xff0c;表示该类中的所有响应请求的方法都是以该地址作为父路径&#xff1b;当注解在方法上时&#xff0c;表示该方法响…

Etcd 框架

基本了解 客户端、长连接与租约的关系 客户端对象 etcd的客户端对象是用户与etcd服务进行交互的主要接口&#xff0c;主要功能就是存储、通知和事务等功能访问 键值存储&#xff1a;客户端通过put 和 get操作存储数据&#xff1b;数据存储在etcd的层级化键值数据库中监听器&a…

2024年11月21日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍&#xff1a;正在构建一个由社区支持的现代化Salesforce替代品。项目star数&#xff1a;21,798项目fork数&#xff1a;2,347 项目名称&#xff1a;p…

前端框架Vue3基础部分

什么是Vue&#xff1f; Vue是一个能用于构建用户交互页面&#xff08;动态网页&#xff09;的渐进式JavaScript框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用性强的Web前端框架。 Vue的设计模式&#xff1f; Vue的设计模式&#xff1a;MVVM模式 MVVM设计模…

革新车间照明,分布式IO模块引领智能制造新纪元

在智能制造的浪潮中&#xff0c;每一个细节的优化都是推动生产效率与能耗管理迈向新高度的关键。车间照明系统&#xff0c;作为生产环境中不可或缺的一环&#xff0c;其智能化升级正成为众多企业转型升级的重要着力点。 一、从传统到智能&#xff1a;照明系统的变革之旅 传统…

1.langchain中的prompt模板(Prompt Templates)

本教程将介绍如何使用 LangChain 库中的提示模板&#xff08;PromptTemplate&#xff09;来生成和处理文本。我们将通过具体的代码示例来解释程序的运行逻辑。 1. 导入必要的库 首先&#xff0c;从 langchain_core.prompts 模块中导入 PromptTemplate 类。 from langchain_c…

Spark 分布式计算中网络传输和序列化的关系(二)

在 Spark 分布式计算 中&#xff0c;网络传输和序列化是数据处理的重要组成部分。Spark 通过将任务划分为多个分布式计算节点来处理数据&#xff0c;而序列化和网络传输直接影响计算性能和数据交互效率。 1. 序列化在 Spark 中的作用 序列化是 Spark 将数据对象转换为字节流以…