LeetCode409-最长回文串(数学题)
一开始觉得这个题目很难,但是仔细看一下,其实是拿字符串里面的字符来构造回文串。
怎样才能构造回文串呢?
对称的才是回文串,所以只要有偶数个同样的字符就行了。
比如AAAABBCBBAAAA
1、只要有偶数个相同的字符,那么他们就能对称分两边,肯定可以啊
2、中间加一个单个的字符就行,因为中间加上一个也是回文。
3、如果是奇数的话,选其中偶数个就行了。
所以,只要统计 偶数个出现的字符个数,奇数个出现-1的字符个数
class Solution { public int longestPalindrome(String s) { Map<Character,Integer> map = new HashMap<>(); int len = s.length(); for(int i=0;i<len;i++){ Integer temp = map.get(s.charAt(i)); if(temp==null){ map.put(s.charAt(i),1); }else{ map.put(s.charAt(i),temp+1); } } Set set = map.keySet(); //偶数,肯定行 //奇数,-1再加上去,如果是1,就加0,没有影响 //如果出现奇数,最后的结果就能+1了,因为毕竟-1再加 boolean flag = false; int result = 0; Iterator<Character> iterator = set.iterator(); while(iterator.hasNext()){ int count = map.get(iterator.next()); if(count%2==0){ result+=count; }else { flag=true; result+=(count-1); } } if(flag) result+=1; return result; } }
最快的做法还是数组,因为A-Z a-z可以用数字表示
但是这俩不是连续的,得用两个数组