LeetCode高频面试60天打卡日记Day19

Day19(最小的K个数)

LeetCode高频面试60天打卡日记Day19_第1张图片
Idea:
对于每个字符 ch,假设它出现了 v 次,我们可以使用该字符 v / 2 * 2 次,在回文串的左侧和右侧分别放置 v / 2 个字符 ch,其中 / 为整数除法。例如若 "a" 出现了 5 次,那么我们可以使用 "a" 的次数为 4,回文串的左右两侧分别放置 2"a"

如果有任何一个字符 ch 的出现次数 v 为奇数(即 v % 2 == 1),那么可以将这个字符作为回文中心,注意只能最多有一个字符作为回文中心。在代码中,我们用 ans 存储回文串的长度,由于在遍历字符时,ans 每次会增加 v / 2 * 2,因此 ans 一直为偶数。但在发现了第一个出现次数为奇数的字符后,我们将 ans 增加 1,这样 ans 变为奇数,在后面发现其它出现奇数次的字符时,我们就不改变 ans 的值了。

class Solution {
     
    public int longestPalindrome(String s) {
     
        int[] arr = new int[128];
        for(char c:s.toCharArray()){
     
            arr[c]++;
        }
        
        int ans = 0;
        for(int n:arr){
     
            ans+=n/2*2;
            //第一次遇到奇数字符时,ans+1,以后遇到奇数不再增加ans直接跳过,只有偶数增加在ans左右两端         
           //ans%2==0  防止以后遍历再次进入if语句
            if(n%2==1 && ans%2==0 ){
     
                ans ++;
            }
        }
        return ans;
    }
}

你可能感兴趣的:(数据结构,leetcode,面试)