Algorithm之路四百零九:Longest Palindrome
来源:互联网 发布:dnf刷深渊网络连接中断 编辑:程序博客网 时间:2024/04/28 12:38
题目:
给出一个字符串,输出能由字符串中的字符构建的回文序列的长度的最大值,区分大小写。
举例:
"abcccdd" ---> 7,因为可以构成的回文序列为"dccaccd",长度为7。
思路:
遍历整个字符串,将字符串中各个字母的出现次数统计起来,用hash表可以很方便的实现查找和添加。最后将各个字母的出现次数加起来,减去出现次数为奇数的字母个数,在加上1即可,如果没有字母的出现次数为奇数,那么不加1。
之前做过的题目中有一道题是计算最长的回文子串,但是这道题和之前那道题不一样,因为这一次求得不是子串,而是可以由串中的字母构成的回文序列,字母的顺序不做限制,解法很明显,出现次数为偶数的字母肯定可以放到回文串中,出现次数为奇数的字母可以放入n-1个字母到回文串中,n为出现次数为奇数的字母的出现个数。并且最终得到的回文串中只允许有一个字母的出现个数为奇数。根据以上的分析,就可以得出结果。
代码:
import java.util.HashMap;import java.util.Iterator;import java.util.Map;public class Longest_Palindrome {public static int longestPalindrome(String s) {Map<Character,Integer> map = new HashMap<>();int length = 0;int odd = 0;for(int i = 0;i < s.length();i++){char ch = s.charAt(i);if(map.containsKey(ch))map.put(ch, map.get(ch)+1);elsemap.put(ch, 1);}Iterator iter = map.entrySet().iterator();while (iter.hasNext()){Map.Entry entry = (Map.Entry) iter.next();char key = (char)entry.getKey();int val = (int)entry.getValue();length += val;if(val %2 == 1)odd++;}if(odd == 0)return length - odd;return length - odd + 1; }public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(longestPalindrome("civilwartestingwhetherthatnaptionoranynartionsoconceivedandsodedicatedcanlongendureWeareqmetonagreatbattlefiemldoftzhatwarWehavecometodedicpateaportionofthatfieldasafinalrestingplaceforthosewhoheregavetheirlivesthatthatnationmightliveItisaltogetherfangandproperthatweshoulddothisButinalargersensewecannotdedicatewecannotconsecratewecannothallowthisgroundThebravelmenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorponwertoaddordetractTgheworldadswfilllittlenotlenorlongrememberwhatwesayherebutitcanneverforgetwhattheydidhereItisforusthelivingrathertobededicatedheretotheulnfinishedworkwhichtheywhofoughtherehavethusfarsonoblyadvancedItisratherforustobeherededicatedtothegreattdafskremainingbeforeusthatfromthesehonoreddeadwetakeincreaseddevotiontothatcauseforwhichtheygavethelastpfullmeasureofdevotionthatweherehighlyresolvethatthesedeadshallnothavediedinvainthatthisnationunsderGodshallhaveanewbirthoffreedomandthatgovernmentofthepeoplebythepeopleforthepeopleshallnotperishfromtheearth"));}}
问题:
看到大神的代码只需要5行,感到真心佩服,不过因为我的层次太低,所以感觉不到代码的美感,因为我读不懂,理解起来很费劲,QAQ。
我提交之前,居然忘记了所有字母出现次数均为偶数的状况,造成了一次WRONG ANSWER,不过没关系,因为,我遇到过不少的WRONG ANSWER,已经被打击习惯了,不过这是一个教训,一定要看的远一些,考虑得多一些。
时间复杂度:
因为需要将整个字符串遍历一遍,所以时间复杂度为O(n),n为字符串的长度。
空间复杂度:
O(min(m,n),n为字符串的长度,m为字符串中出现的字母的种类数,因为需要哈希表的空间,实际上也就是O(m)了。
阅读全文
0 0
- Algorithm之路四百零九:Longest Palindrome
- Algorithm之路九:Palindrome Number
- Algorithm之路五:Longest Palindromic Substring
- Algorithm之路十四:Longest Common Prefix
- LeetCode之路:409. Longest Palindrome
- Algorithm之路三:Longest Substring Without Repeating Characters
- Longest Palindrome
- Longest Palindrome
- Longest Palindrome
- Longest Palindrome
- Longest Palindrome
- Longest Palindrome
- Longest Palindrome
- Longest Palindrome
- 【Leetcode Algorithm】Palindrome Number
- [Algorithm] Palindrome 问题
- Python零基础入门之九字典
- 算法之旅,直奔<algorithm>之九 count
- GDI+学习及代码总结之------文本与字体
- 4篇Nature同时揭示DNA自组装技术,离人造生命又近了一步
- 二维方格子Ising模型代码
- 为什么说特斯拉研发自动驾驶AI芯片应该引起注意?
- IDEA 快捷键(MAC 版)说明
- Algorithm之路四百零九:Longest Palindrome
- Dubbo学习小记
- 【Android】【TP】TP开发常见问题&分析&产线检测CTP单体异常
- Java 常用类库(三)
- SVM原理详解
- C++ 归并排序,千万级以上数据的排序
- JavaScript面向对象
- MyBatis的动态SQL详解 转自 234390216
- 如何解决旋屏应用受马达影响的case