题目(中等)

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

请你从 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” 是另一个可以得到的最长回文串。
示例 3:

输入:words = [“cc”,“ll”,“xx”]
输出:2
解释:最长回文串是 “cc” ,长度为 2 。
“ll” 是另一个可以得到的最长回文串。“xx” 也是。

提示:

1 <= words.length <= 105
words[i].length == 2
words[i] 仅包含小写英文字母。

思路

看数据范围,1e5,用暴力两两配对尝试必然超时,所以用哈希表分情况计数;
对于叠词,如果成对出现,可以加入答案,如果有单独的,只能在中间多加一个;
对于普通词tmp,能配对的只有它和它回文符串couple,这两个字符串中出现次数最小的min(nomal[tmp], nomal[couple])次数才能配对成功,多余部分不能加入答案。
为避免重复计数,每次加入后清除该字符串的计数

代码

class Solution {public:int longestPalindrome(vector<string>& words) {int ans = 0;unordered_map<char, int> same;  //存叠词及其出现次数unordered_map<string, int> nomal;   //存普通词及其次数for(auto word : words) {if(word[0] == word[1]) same[word[0]]++;else nomal[word]++;}int flag_same = 0;for(auto x : same) {if(x.second % 2 == 0) ans += x.second * 2;  //成对叠词可组队else {flag_same = 1;ans += (x.second / 2) * 4;  //偶数部分配对}}ans += flag_same * 2;   //最多允许一个叠词横跨for(auto x : nomal) {string tmp = x.first;if(nomal[tmp] == 0) continue;string couple;couple.push_back(tmp[1]);couple.push_back(tmp[0]);ans += min(nomal[tmp], nomal[couple]) * 4;nomal[tmp] = 0;nomal[couple] = 0;}return ans;}
};

力扣2131——连接两字母单词得到的最长回文串(贪心+哈希表)相关推荐

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

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串数组 words .words 中每个元素都是一个包含 两个 小写英文字母的单词. 请你从 words 中选择一些元素并按 任意顺序 连接它 ...

  2. Leetcode69场双周赛-第三题5962. 连接两字母单词得到的最长回文串

    5962. 连接两字母单词得到的最长回文串 题目描述 解题思路和解题代码 定义map和sameMap.如果两个字母一样,就看sameMap里面有没有记录,有的话把该记录取出来,结果总数+4,没有的话, ...

  3. python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)

    最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字 ...

  4. Python中判断字符是否为字母、数字、字母和数字组合,验证回文串(LeetCode125)

    判断字符串是否为字母.数字 函数str.isdigit()判断字符是否为数字,函数str.isalpha()判断字符是否为字母,函数isalnum()判断字符是否为数字字母组合. 上代码: str1 ...

  5. 力扣HOT100算法题5:最长回文字串

    文章目录 一.题目 二.方法一:解题思路 三.方法一:代码解析 四.方法二:动态规划 五.方法二:代码解析 一.题目 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1:输入:s = &quo ...

  6. 力扣Leetcode:5. 最长回文子串(Python)

    题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...

  7. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数

    题目描述(难度困难) 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符.请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字符串. 示例 1: 输入: ...

  8. 2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数组strs和一个目标字符串target。target的简写不能跟strs打架。 strs是[“abcdefg“,“ccc“],tar

    2022-01-22:力扣411,最短独占单词缩写. 给一个字符串数组strs和一个目标字符串target.target的简写不能跟strs打架. strs是["abcdefg", ...

  9. 力扣--让字符串成为回文串的最少插入次数

    力扣–让字符串成为回文串的最少插入次数 文章目录 力扣--让字符串成为回文串的最少插入次数 一.题目描述 二.分析 三.代码 相关题目: 腾讯–构造回文:腾讯–构造回文 最长回文子串和回文链表:最长回 ...

最新文章

  1. 某程序员对比美团和阿里的卷文化区别:美团重过程,死抠没用细节;阿里更自由,注重结果!...
  2. “芯”战争,人工智能芯片研发攻略
  3. BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [
  4. IOS基础之UIDynamicAnimator动力学入门-02
  5. 扩展entity framework core实现默认字符串长度,decimal精度,entity自动注册和配置
  6. android sd卡不可写,Android检查SD卡是否可读写
  7. Mysql事务探索及其在Django中的实践(二)
  8. [2019.3.25]多项式求逆
  9. [数据模型] 数据表三种关联的概述
  10. kali扫描内网ip_kali linux 如何查找局域网ip
  11. 本地数据库数据导入linux
  12. mui项目php,基于h5+的app 开发介绍、hui、mui介绍、项目部署
  13. 国内使用谷歌地图方案
  14. Zbrush curve Tube ,Move topologica笔刷的使用
  15. 下一关口令:别犹“豫”,看“浙”里,一起“皖”
  16. 灰灰考研c语言讲义,【灰灰考研】操作系统复习全书.pdf
  17. 解决:mmc0: error -110 whilst initialising SD card.md
  18. CAD小问题解决办法1
  19. 微信小程序授权微信手机号踩坑,第一次无法获取到手机号,第二次成功的解决方案
  20. Prior-Induced Information Alignment for Image Matting

热门文章

  1. 试编写汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数
  2. (学无止境)linux 虚拟机联网
  3. rocket MQ 实战应用
  4. liunx内置计算器bc工具
  5. 计算机磁盘利用100,笔记本电脑磁盘占用率高达100%怎么处理
  6. java利用poi模板导出word文件
  7. VUE中让字体大小跟随窗口变化
  8. Power-law Distributions(幂律分布)
  9. 锁定计算机后点鼠标屏幕无反应,电脑鼠标点击桌面没有反应怎么办
  10. c语言在windows和mac,c语言在windows下和Mac下的不同表现!