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可以用数字表示

但是这俩不是连续的,得用两个数组

 

posted @ 2018-09-26 16:39  朋友圈  阅读(734)  评论(0编辑  收藏  举报