PalindromePermutation [source code]


public class PalindromePermutation {
    public boolean canPermutePalindrome(String s) {
        char[] letters = s.toCharArray();
        Set<Character> set = new HashSet<>();
        for (char c : letters) {
            if (set.contains(c)) set.remove(c);
            else set.add(c);
        }
        if (set.size() > 1) return false;
        return true;
    }

    public static void main(String[] args) {
        PalindromePermutation tester = new PalindromePermutation();
        String input1 = "abdg";
        System.out.println(tester.canPermutePalindrome(input1));
    }
}

这个是一开始用类似 SingleNumber 里面的remove duplicate的算法写的一个算法:

    public boolean canPermutePalindrome(String s) {  
        char[] letters = s.toCharArray();  
        char xor = 0;  
        for (int i = 0; i < letters.length; i++) xor ^= letters[i];  
        if (xor == 0) return true;  
        for (char c : letters)  
            if (xor == c) return true;  
        return false;  
    }

这个算法看起来很美好, linear 的时间,但是实际上是不对的, 问题就在于:

java> 'a'^'b'^'d'^'g'  
java.lang.Integer res1 = 0

其实这种 case 的存在我一开始也是知道的, 也是抱着一种碰运气的心理, 结果没想到 lc 居然真的准备了这样的 case 来防止被投机取巧;

不过能想到remove duplicate的思路来做其实就是已经找到核心问题了. 这个题目的核心思路其实还是pair remove duplicate, 只不过不能用 xor 来做了而已. 更加 general 的做法就是这里的, 用set, 其实也是很简单的.

另外回文的 legitimacy, 如果让你用一句话概括: there can be at least one char that has a odd number of occurrence.

关于保存历史信息, 不要一看到就想要用 hashmap. set 也是可以的, 事实上, 所有的都可以, 只不过hashmap 是更强力的一种而已. 这里这个用 hashmap 肯定也是可以做的, 就是麻烦一些, 因为肯定要自己判断 duplicate 了到时候. set 只是更适合这里;

速度是3ms. 最优解是0ms, 好像还是有提升空间;


Problem Description

Given a string, determine if a permutation of the string could form a palindrome.

For example,
"code" -> False, "aab" -> True, "carerac" -> True.

Hide Company Tags Google Uber Bloomberg
Hide Tags Hash Table
Hide Similar Problems (M) Longest Palindromic Substring (E) Valid Anagram (M) Palindrome Permutation II (E) Longest Palindrome

results matching ""

    No results matching ""