【Lintcode】627. Longest Palindrome

題目地址:

https://www.lintcode.com/problem/longest-palindrome/description

給定一個字符串ss,問由這個字符串內的字符能構成的最長迴文串的長度。很顯然最長的迴文串可以這樣構成:如果一個字符在ss內出現了偶數次,那就全拿過來,兩邊對稱着放;如果出現了奇數次,那就將其最大的偶數部分拿出來兩邊對稱着放;最後,如果還剩字符,就隨便拿一個放在正中間。

也可以反過來想,先將答案初始化爲字符串的長度。可以先統計各個字母在字符串中出現的次數,然後掃描這些次數。如果掃描到偶數次,就什麼都不做,否則就將答案 - 1(因爲奇數次的字符先拿最多偶數個,所以要將多出來那個減掉)。最後判斷一下有沒有出現過奇數次的字符,如果出現過,最後答案再 + 1再返回,否則直接返回。代碼如下:

public class Solution {
    /**
     * @param s: a string which consists of lowercase or uppercase letters
     * @return: the length of the longest palindromes that can be built
     */
    public int longestPalindrome(String s) {
        // write your code here
        // 判空
        if (s == null || s.isEmpty()) {
            return 0;
        }
        // 分別統計小寫字母和大寫字母出現的次數
        int[] alpha = new int[26];
        int[] Alpha = new int[26];
    
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) >= 'a') {
                alpha[s.charAt(i) - 'a']++;
            } else {
                Alpha[s.charAt(i) - 'A']++;
            }
        }
        
        // 初始化答案爲字符串長度
        int len = s.length();
        for (int i = 0; i < 26; i++) {
        	// 如果某個字符出現了奇數次,答案就減1
            if (alpha[i] % 2 != 0) {
                len--;
            }
            if (Alpha[i] % 2 != 0) {
                len--;
            }
        }
        // 如果答案沒被減過,說明每個字符都出現了偶數次,那就直接返回
        // 否則說明有字符出現過奇數次,隨便拿一個放正中間即可,答案加1
        return len == s.length() ? len : len + 1;
    }
}

時間複雜度O(n)O(n),空間O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章