zoukankan      html  css  js  c++  java
  • 266. Palindrome Permutation

    题目:

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

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

    Hint:

      1. Consider the palindromes of odd vs even length. What difference do you notice?
      2. Count the frequency of each character.
      3. If each character occurs even number of times, then it must be a palindrome. How about character which occurs odd number of times?

    链接: http://leetcode.com/problems/palindrome-permutation/

    题解:

    判断一个String是否可以组成一个Palindrome。我们只需要计算单个字符的个数就可以了,0个或者1个都是可以的,超过1个则必不能成为Palindrome。双数的字符我们可以用Set来even out。

    Time Complexity - O(n), Space Complexity - O(n)

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            if(s == null) {
                return false;
            }
            Set<Character> set = new HashSet<>();
            for(int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if(set.contains(c)) {
                    set.remove(c);
                } else {
                    set.add(c);
                }
            }
            
            return set.size() <= 1;
        }
    }

    二刷:

    Java:

    Time Complexity - O(n), Space Complexity - O(n)

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            if (s == null) {
                return false;
            }
            Set<Character> set = new HashSet<>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (!set.add(c)) {
                    set.remove(c);
                }
            }
            return set.size() <= 1;
        }
    }

    使用Bitmap:

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            if (s == null || s.length() == 0) {
                return false;
            }
            int[] bitArr = new int[256];
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                bitArr[c]++;
            }
            boolean foundSingleChar = false;
            for (int i = 0; i < 256; i++) {
                if (bitArr[i] % 2 != 0) {
                    if (foundSingleChar) {
                        return false;
                    } else {
                        foundSingleChar = true;
                    }
                }
            }
            return true;
        }
    }

    简写后的bitmap,因为没有set的remove(),所以速度更快一些,当然这是我们假定字符都属于ascii的前提下。

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            if (s == null || s.length() == 0) {
                return false;
            }
            int[] bitArr = new int[256];
            int count = 0;
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                bitArr[c]++;
                count = bitArr[c] % 2 != 0 ? count + 1 : count - 1;
            }
            return count <= 1;
        }
    }

    Python: 

    来自StefanPochmann

    class Solution(object):
        def canPermutePalindrome(self, s):
            """
            :type s: str
            :rtype: bool
            """
            return sum(v % 2 for v in collections.Counter(s).values()) < 2
            

    三刷:

    对于unicode还是用HashSet比较好。 题目可以假定Alphabet只有ASCII所以我们也可以用bitmap。

    Java:

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            if (s == null) return false;
            if (s.length() <= 1) return true;
            Set<Character> set = new HashSet<>();
            for (int i = 0; i < s.length(); i++) {
                if (!set.add(s.charAt(i))) set.remove(s.charAt(i));
            }
            return set.size() <= 1;
        }
    }

    Update:

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            if (s == null) return false;
            Set<Character> set = new HashSet<>(s.length());
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (!set.add(c)) set.remove(c);
            }
            return set.size() < 2;
        }
    }

    Reference:

    https://leetcode.com/discuss/71076/5-lines-simple-java-solution-with-explanation

    https://leetcode.com/discuss/70848/3-line-java-functional-declarative-solution

    https://leetcode.com/discuss/53180/1-4-lines-python-ruby-c-c-java

  • 相关阅读:
    Day 25 网络基础2
    Day 25 网络基础
    Day 24 定时任务
    Day 23 系统服务之救援模式
    Day4 总结
    Day 22 进程管理2之系统的平均负载
    【Distributed】分布式Session一致性问题
    【Distributed】分布式系统中遇到的问题
    【Redis】分布式Session
    【Zookeeper】应用场景概述
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5021398.html
Copyright © 2011-2022 走看看