01.04 回文排列

Posted 曦月宇望

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01.04 回文排列相关的知识,希望对你有一定的参考价值。

力扣面试金题-01.04 回文排列

01.04 回文排列

1、题目

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。

回文串不一定是字典当中的单词。

1)示例

输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)

2、初步作答

2.1 思路

  • 题目已经给出是字母的重新排列,所以只需要判断字符串中字符个数

  • 空字符串是回文串的排列

  • 如果字符串是回文串的排列方式之一

    • 第一种情况:字符串字母成对出现,或是每个字符的个数都是偶数
    • 第二种情况:只有一个字母个数是奇数,其余所有字符个数是偶数
  • 如果满足上述两种情况之一,就返回 true ;否则就返回 false

2.2 做法

  • 判断字符串是否为空字符串
  • 字符串长度小于 2,返回 false;
  • 建立一个大小为128的整型数组存放字符个数,字符的ASCII码转换作为数组下标
  • 循环判断数组对 2 取余是否为 0,不为 0 直接返回 false

2.3 代码

public class Palindromic 
    public static void main(String[] args) 
        String string = new String();
        string = "j";
        System.out.println(canPermutePalindrome(string));
    

    public static boolean canPermutePalindrome(String s) 
        if (s.isEmpty())
            return false;
        
        if (s.length() == 1)
            return true;
        
        int[] num = new int[128];
        char s1;
        int nums;
        for (int i = 0; i < s.length(); i++) 
            s1 = s.charAt(i);
            nums = s1 ;
            num[nums] = num[nums] + 1;
        
        nums = 0;
        for (int j = 0; j < 128; j++) 
            if(num[j] % 2 ==0)
                continue;
            else
                nums ++;
            
        
        if(nums > 1)
            return false;
        
        return true;
    

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39.2 MB, 在所有 Java 提交中击败了8.14%的用户
通过测试用例:27 / 27

2.4 思考

内存消耗较大,是由于默认字符为所有 ASCII 码,所以设立了一个长度为 128 的数组,导致内存消耗较大。这也是作者的第一个解法,大家有什么好的解决办法呢?!

3、其余解法

3.1 位运算

来自力扣作者:dc3a2nLETu

class Solution 
    public boolean canPermutePalindrome(String s) 
        long front = 0, end = 0;
        for (int i = 0; i < s.length(); i++) 
            if (s.charAt(i) >= 64) 
                end ^= 1L << s.charAt(i) - 64;
             else 
                front ^= 1L << s.charAt(i);
            
        
        return Long.bitCount(front) + Long.bitCount(end) <= 1;
    

3.2 哈希表

来自力扣作者:jyd

class Solution 
    public boolean canPermutePalindrome(String s) 
        HashMap<Character, Integer> dic = new HashMap<>();
        for (int i = 0; i < s.length(); i++) 
            dic.put(s.charAt(i), dic.getOrDefault(s.charAt(i), 0) + 1);
        
        int odd = 0;
        for (int val : dic.values()) 
            if (val % 2 == 1) 
                if (++odd > 1)
                    return false;
            
        
        return true;
    

以上是关于01.04 回文排列的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试题01

回文排列和排列有啥区别? [关闭]

2021/5/23 刷题笔记回文排列

916. 回文排列

面试题 01.04. 回文排列

面试题 01.04. 回文排列