当前位置: 首页 > news >正文

2131. 连接两字母单词得到的最长回文串

题目链接

2131. 连接两字母单词得到的最长回文串 - 力扣(LeetCode)

题目描述

给你一个字符串数组wordswords中每个元素都是一个包含 两个 小写英文字母的单词。

请你从words中选择一些元素并按 任意顺序 连接它们,并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。

请你返回你能得到的最长回文串的 长度 。如果没办法得到任何一个回文串,请你返回0

回文串 指的是从前往后和从后往前读一样的字符串。

题目示例

示例 1 :

输入:words = ["lc","cl","gg"] 输出:6 解释:一个最长的回文串为 "lc" + "gg" + "cl" = "lcggcl" ,长度为 6 。 "clgglc" 是另一个可以得到的最长回文串。

示例 2 :

输入:words = ["ab","ty","yt","lc","cl","ab"] 输出:8 解释:最长回文串是 "ty" + "lc" + "cl" + "yt" = "tylcclyt" ,长度为 8 。 "lcyttycl" 是另一个可以得到的最长回文串。

解题思路

  1. 问题理解:题目要求从给定的单词数组中构造最长的回文串。回文串的特点是正读反读相同,因此单词的排列需要满足对称性。
  2. 关键观察
    • 对称单词(如"aa"、“bb”):可以成对使用,或者单独一个放在中间。
    • 非对称单词(如"ab"、“ba”):必须成对出现,即"ab"和"ba"的数量必须相等才能配对使用。
  3. 算法设计
    • 统计每个单词的出现次数。
    • 对于对称单词,尽可能多地成对使用,并记录是否存在奇数次的对称单词。
    • 对于非对称单词,取"ab"和"ba"中较小的出现次数,成对使用。
    • 最终回文串的长度由成对单词的对数和是否有一个对称单词可以放在中间决定。

题解代码

classSolution{publicintlongestPalindrome(String[]words){// 创建一个26x26的二维数组,用于统计每个单词出现的次数// cnt[i][j]表示第一个字母是('a'+i),第二个字母是('a'+j)的单词出现的次数int[][]cnt=newint[26][26];// 遍历所有单词,统计每个单词出现的次数for(Stringw:words){cnt[w.charAt(0)-'a'][w.charAt(1)-'a']++;}intans=0;// 用于记录最终的回文串长度intodd=0;// 标记是否存在出现奇数次的对称单词(如"aa")// 遍历所有可能的字母组合for(inti=0;i<26;i++){// 处理对称单词(如"aa"、"bb"等)intc=cnt[i][i];// 取最大的偶数次,因为对称单词需要成对出现才能构成回文ans+=c-c%2;// 如果存在奇数次的对称单词,可以将其中的一个放在回文串的正中间odd|=c%2;// 处理非对称单词(如"ab"、"ba"等)for(intj=i+1;j<26;j++){// 取"ab"和"ba"中较小的出现次数,因为它们需要成对出现ans+=Math.min(cnt[i][j],cnt[j][i])*2;}}// 最终回文串长度 = (成对单词的对数 * 2 + 是否有一个对称单词可以放在中间) * 2// 乘以2是因为每个单词长度为2return(ans+odd)*2;}}

复杂度分析

  1. 时间复杂度
    • 统计单词出现次数:O(n),其中n是单词数组的长度。
    • 遍历26x26的二维数组:O(26^2) = O(1),因为26是常数。
    • 总时间复杂度:O(n + 1) = O(n)。
  2. 空间复杂度
    • 使用了一个26x26的二维数组:O(26^2) = O(1)。
    • 其他变量是常数空间。
    • 总空间复杂度:O(1)。
http://www.jsqmd.com/news/770137/

相关文章:

  • 如何为Android TV添加虚拟鼠标功能:MATVT完整使用指南
  • 特斯拉Model 3/Y CAN总线DBC文件:开发者实战指南与车辆数据解析
  • 别再让OPC DA服务器崩溃了!一个JAVA连接中Group管理的致命坑与两种修复方案
  • GD32F450实战:从25MHz晶振到200MHz系统时钟,手把手配置AHB/APB分频
  • 从抓包到自动化:我是如何破解快手APP的token签名(__NStokensig)来爬取用户作品的
  • 保姆级教程:用SolidWorks/ANSYS复现一台YAH2460振动筛的动力学仿真与优化
  • 别再手动画图了!用evo工具箱5分钟搞定SLAM轨迹评估与可视化(附KITTI数据集实战)
  • Tiledesk开源客服平台:从部署到定制的完整指南
  • 在 Taotoken 平台查看模型广场并理解各模型特点与适用场景
  • MCP Explorer:AI工具链的可视化调试与集成测试平台
  • GIMP Resynthesizer终极指南:如何用AI纹理合成技术彻底改变你的图像编辑工作流
  • 终极皮肤管理指南:如何快速上手 d3dxSkinManage 工具
  • 论文AI率从90%降到3%!这4个降AI软件效果出奇好,顺利通过aigc检测!
  • 企业多模型 API 管理场景下如何利用 Taotoken 实现成本与稳定性平衡
  • 从“蒙特卡洛”到“马尔可夫”:手把手教你用Python模拟电力系统可靠性(附IEEE-RTS79案例代码)
  • 如何3分钟完成QQ空间历史数据备份:GetQzonehistory完整操作指南
  • 专业的codex调用gpt模型好用的企业
  • 让模糊照片瞬间变清晰:CodeFormer智能人脸修复工具完全指南
  • 让地图“活”起来:ORB-SLAM2 + D435i实时彩色点云建图实战(附配置文件与内参标定)
  • ARM LPDDR2 DMC-342内存控制器错误分类与工程实践
  • 无头ChatGPT客户端:原理、应用与自动化工作流实战
  • 使用Python快速接入Taotoken并实现第一个聊天补全调用示例
  • HPH构造全解析 内部原理与组装要点
  • FlipIt:为Windows屏幕注入复古机械美学的智能翻页时钟屏保
  • 基于Next.js与Vercel的私有AI对话应用部署与定制指南
  • GitHub 本周霸榜第一,FinceptTerminal 你将拥一个24H为你工作的金融分析专家
  • 基于MCP协议构建农业大宗商品气候风险情报引擎
  • 分布式系统开发新范式:基于pnpm+Nx的超级工作区编排实践
  • 别再只会调参数了!用Unity粒子系统手把手教你做逼真烟雾(附贴图与完整曲线设置)
  • 打造专属媒体体验:开源插件高级定制完全指南