2020年ICPC辽宁省赛- 最长回文串(Java)
最长回文串
- 题目描述
- 算法分析
- 代码展示
题目描述
链接: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)相关推荐
- 伍六七带你学算法 入门篇-最长回文串
力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...
- manacher算法----O(n)最长回文串
manacher算法----O(n)最长回文串 分类:字符串 (126) (0) 举报 收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...
- python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)
最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字 ...
- 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)
1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...
- Leetcode69场双周赛-第三题5962. 连接两字母单词得到的最长回文串
5962. 连接两字母单词得到的最长回文串 题目描述 解题思路和解题代码 定义map和sameMap.如果两个字母一样,就看sameMap里面有没有记录,有的话把该记录取出来,结果总数+4,没有的话, ...
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...
- java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...
1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...
- 最长回文串--动态规划
最长回文串–动态规划 参考:https://writings.sh/post/algorithm-longest-palindromic-substring class Solution {publi ...
- 1616: 最长回文串(马拉车算法)
1616: 最长回文串 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 求一个字符串的最长 ...
最新文章
- mySql 主从复制linux配置
- 您现在只需免费与相机捆绑即可购买一个PSVR
- 手写简版spring --2--实现Bean的定义、注册、获取
- 中文幽默语料库构建与计算项目(幽默等级识别,幽默类型识别,隐喻类型识别,隐喻情绪识别)
- 递归判断一个数是否递增
- PHP cookie和session的分析
- 《JavaScript高级程序设计 第三版》学习笔记 (十三)高级函数
- erstudio怎么导入mysql数据库?_使用ERStudio生成数据库设计文档。
- javascript 替换全部字符串
- 谷歌浏览器无法上网问题解决
- 用js实现建议绘图板
- [VT虚拟化驱动]利用EPT实现无痕HOOK
- GIT 命令学习:获取与创建项目
- vue+elementui表格前端导出excel以及自定义导出样式
- 不可或缺的LTO磁带存储
- 日志自动分析和解析开源工具
- redirectType=Found和redirectType=Permanent哪个是301哪个是302?
- 1、使用类与接口的知识完成如下要求:(1)定义一个接口CanFly,描述会飞的方法public void fly();(2)分别定义类飞机和鸟,实现CanFly接口。(3)定义一个测试类,测试飞
- 模拟电子技术基础笔记(4)——晶体三极管
- OSCAR开源大会 | 「开源学」:如何分门别类理解开源