最长回文串

  • 题目描述
  • 算法分析
  • 代码展示

题目描述

链接:ICPC辽宁省赛复现赛

题目描述
回文串是反转后与自身完全相同的字符串
比如:“ABA”,“ACMMCA”,“A”。
给出一系列长度相同的字符串,请按序进行如下操作构造出最长的回文串:

1.舍弃一些字符串
2.重新排列剩余的每个字符串内字符的顺序,重新排列后的结果可以与原字符串相同
3.重新排列剩余字符串的顺序
4.将剩余字符串按序首尾连接组成回文串

输入描述:

第一行输入两个整数 n 和 m (1≤n≤100,1≤m≤50),表示字符串的数量和每个字符串的长度。
接下来 n 行每行包含一个长度为m的字符串,每个字符串由小写英文字母组成。

输出描述:

每组数据输出一个整数,表示经过以上四次操作你能够得到的最长回文串的长度。

算法分析

贪心算法:我们如何选择,可以使新组成的字符串长度最大

我们可以考虑到一下情况

  • 当一个字符串(不考虑字符顺序)出现偶数次,那么我们便可以将它平均放到新字符串的两边,可以重组为回文串
  • :“abc” “acb”,(不考虑字符顺序)等同于 “abc” 出现两次,可以重新排列为 “abc cba”,即回文串
  • 当一个字符串(不考虑字符顺序)出现奇数次,那么我们便可以将它的 (出现次数-1)即:偶数次平均放到新字符串的两边,可以继续重组为回文串
  • 那么该字符串最后剩下的一个,如果该字符串本身是 回文串的话,我们就可以将它放在中间,从而不影响新字符串的整体回文性
  • 注意:放在中间的只能有一个字符串,且该字符串必须是回文的,否则便舍弃

例如

“aab” “aab” “aab”
“aac”“aac”“aac”“aac”“aac”

  • 将"aab" "aac"偶数次个分别放在两边,组成新字符串:

“aab aac aac caa caa baa”

  • 那么还剩下一个"aab" “aac”,我们需要判断这两个字符串是否是回文串
  • 将任意一个回文串放在中间就行
  • 若两个都不是回文串,就全都舍弃

“aab aac aac aca caa caa baa”
or
“aab aac aac aba caa caa baa”

代码展示

判断字符串是否可以通过重新排列字符顺序 组成回文串,我们只需要统计不同字符出现的次数 即可。
若出现奇数次的字符,超过1个,那其必定不能重构成回文串。这里请自行举例思考。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();sc.nextLine();  // 缓冲上面的 \nMap<String, Integer> map = new HashMap<>();// 统计重复的字符串个数,因为字符串顺序可以改变,因此我们将所有的字符串升序排序,加入map中while (n-- > 0) {char[] c = sc.nextLine().toCharArray();Arrays.sort(c);String s = new String(c);map.put(s, map.getOrDefault(s, 0)+1);}int res = 0;boolean flag = false;  // 标志位,判断是奇数次字符串,是否是回文串for (String s: map.keySet()) {// 如果出现偶数次,直接要if ((map.get(s)&1) == 0) {res += (s.length() * map.get(s));} else {if (check(s))flag = true;// 如果出现奇数次,只要 偶数次res += ((map.get(s)-1) * m);}}// 如果出现奇数次的字符串中有回文串,任意一个放中间即可,所以加一个字符串长度 mif (flag)res += m;System.out.println(res);}// 判断是否可以重构成回文串public static boolean check(String s) {Map<Character, Integer> map = new HashMap<>();// 统计词频for (char c: s.toCharArray())map.put(c, map.getOrDefault(c, 0)+1);// 统计奇数次字符个数int k = 0;// 遍历 mapfor (char c: map.keySet()) {if ((map.get(c)&1) == 1)k++;}return k < 2;}
}

感谢 我的队友 hxd,感谢 宋大佬 yyds
加油!

2020年ICPC辽宁省赛- 最长回文串(Java)相关推荐

  1. 伍六七带你学算法 入门篇-最长回文串

    力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...

  2. manacher算法----O(n)最长回文串

    manacher算法----O(n)最长回文串 分类:字符串 (126)  (0)  举报  收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...

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

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

  4. 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

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

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

  6. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  7. java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  8. 最长回文串--动态规划

    最长回文串–动态规划 参考:https://writings.sh/post/algorithm-longest-palindromic-substring class Solution {publi ...

  9. 1616: 最长回文串(马拉车算法)

    1616: 最长回文串 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 求一个字符串的最长 ...

最新文章

  1. mySql 主从复制linux配置
  2. 您现在只需免费与相机捆绑即可购买一个PSVR
  3. 手写简版spring --2--实现Bean的定义、注册、获取
  4. 中文幽默语料库构建与计算项目(幽默等级识别,幽默类型识别,隐喻类型识别,隐喻情绪识别)
  5. 递归判断一个数是否递增
  6. PHP cookie和session的分析
  7. 《JavaScript高级程序设计 第三版》学习笔记 (十三)高级函数
  8. erstudio怎么导入mysql数据库?_使用ERStudio生成数据库设计文档。
  9. javascript 替换全部字符串
  10. 谷歌浏览器无法上网问题解决
  11. 用js实现建议绘图板
  12. [VT虚拟化驱动]利用EPT实现无痕HOOK
  13. GIT 命令学习:获取与创建项目
  14. vue+elementui表格前端导出excel以及自定义导出样式
  15. 不可或缺的LTO磁带存储
  16. 日志自动分析和解析开源工具
  17. redirectType=Found和redirectType=Permanent哪个是301哪个是302?
  18. 1、使用类与接口的知识完成如下要求:(1)定义一个接口CanFly,描述会飞的方法public void fly();(2)分别定义类飞机和鸟,实现CanFly接口。(3)定义一个测试类,测试飞
  19. 模拟电子技术基础笔记(4)——晶体三极管
  20. OSCAR开源大会 | 「开源学」:如何分门别类理解开源

热门文章

  1. Word给公式插入编号和引用
  2. 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
  3. DM达梦数据库存储过程和触发器
  4. 微型计算机48MHz辐射超,EMI辐射测试超标 求高手指点
  5. STL mismatch算法
  6. 走近棒球运动·休斯敦太空人队·MLB棒球创造营
  7. 快学会这个技能-.NET API拦截技法
  8. 互联网业务实战(一)--今日头条文章发布实现
  9. 2019届华为秋招数字芯片面试经验
  10. 使用U盘win10家庭版本系统重装