力扣409-最长回文串

Copyright©Zi10ng
一个渣渣的成长之路

这是一个关于回文串的题

  • 题目地址

题目描述:

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

题目思路

这里不是让找出最长回文串而是构造最长回文串,所以只要明白回文串的性质基本都可以做出来

  • 找到字符串中偶数个,即aa , bb
  • 如果有奇数次数字符存在,则应该+1

解法

初步解法
   public int longestPalindrome(String s) {
        //重复最大值和单个最大值
        int doubleMax = 0;
        int simpleMax = 0;
        int length = s.length();

        if (length == 1){
            return 1;
        }
        //主要是为了排序
        ArrayList<Character> queue = new ArrayList<>();

        for (int i = 0; i < length; i++) {
            queue.add(s.charAt(i));
        }

        queue.sort(Comparator.comparingInt(o -> o));

        //对排好序的进行检索,找到重复偶数倍的,注意越界问题
        for (int i = 0; i < length - 1; i++) {
            int j = i + 1;
            boolean flag = queue.get(i).equals(queue.get(j));
            if (flag){
                doubleMax ++;
                i = j ;
            }if (!flag || i == length - 2){
                simpleMax = 1;
            }
        }
        return doubleMax*2 + simpleMax;
    }
优化解法
public int solution(String s) {
        int[] count = new int[128];
        for (char c: s.toCharArray()) {
            //字符还可以作为索引,默认转化为Unicode
            count[c]++;
        }

        int ans = 0;
        for (int v: count) {
            //计算出偶数的个数
            ans += v / 2 * 2;
//            如果检测到奇数且之前的是偶数
//            if (v % 2 == 1 && ans % 2 == 0) {
//                ans++;
//            }
        }
        return ans < s.length() ? ++ ans : ans;
    }
最终解法
class Solution {
    public int longestPalindrome(String s) {
        int[] count = new int[128];
        int max = 0;
        //计算重复的个数
        for(char c: s.toCharArray()){
            if (++count[c] == 2){
                max ++;
                count[c] = 0;
            }
        }
        max *= 2;
        return max < s.length() ? ++max : max;
    }
}

感悟

因为想用用Java的集合框架,所以就没有去直接计算每个字符出现的次数
我的思路是通过集合框架进行排序,然后再计算字符出现次数。
由于对集合类仅仅停留在百度会用的阶段,所以在我用集合框架的时候出现了一些问题
之后也没有考虑数组越界的问题

你可能感兴趣的:(算法和数据结构)