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

  • 相关阅读:
    PHP+NGINX
    mysql添加索引
    SecureFX 乱码问题
    kali ssh服务连接问题,无法远程管理
    Nginx安装配置
    redhat mysql安装配置
    shell脚本-1
    Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks-paper
    Parsing with Compositional Vector Grammars--paper
    Reasoning With Neural Tensor Networks For Knowledge Base Completion-paper
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5021398.html
Copyright © 2011-2022 走看看