面试题 01.04. 回文排列

Posted yangbocsu

tags:

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

一、题目描述

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。 回文串不一定是字典当中的单词。

二、思路详解

回文字符串的特征:
1、所有出现的字符要么都是偶数个数;
2、所有出现的字符要么只有一个奇数个数,其他都是偶数
抓住奇数这个特征;用字典来统计单个元素出现的次数;

三、参考代码

【1.0】字典解法

class Solution 
    public boolean canPermutePalindrome(String s) 
    
        //回文字符串的特征:1、所有出现的字符都是偶数个数;2、所有出现的字符只有一个奇数个数,其他都是偶数
        Byte flag = 0;//奇数标志位
        HashMap<Character,Integer>dic = new HashMap<>();    //字典

        // 字典赋值
        for(int i=0; i<s.length();i++)
        
        //当遍历字符串s时,dic.get(s.charAt(i))返回为null时,字典里没此元素,此时值+1,当dic.get(s.charAt(i))返回非空时在此值基础上加一
            dic.put(s.charAt(i),dic.get(s.charAt(i))==null ? 0+1 : dic.get(s.charAt(i)) + 1);
        

        // 遍历字典
        for (Map.Entry i : dic.entrySet())
        
            if ((int)(i.getValue())%2 != 0) //找值为奇数的元素
            
                flag++;
                if (flag>1)  
                    return false;
            
        
        return true;
        
        

    

【2.0】集合解法

每个字符出现的次数为偶数, 或者有且只有一个字符出现的次数为奇数时, 是回文的排列; 否则不是.

class Solution 
    public boolean canPermutePalindrome(String s) 
        Set<Character> set = new HashSet<>();
        for (char c : s.toCharArray()) 
            if (!set.add(c)) 
                set.remove(c);
            
        
        return set.size() <= 1;
    


//来源:
//作者:jiangzs
//链接:https://leetcode-cn.com/problems/palindrome-permutation-lcci/solution/li-yong-ha-xi-biao-by-jiangzs/
//源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

四、题目来源

面试题 01.04. 回文排列

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

面试题 01.04. 回文排列

文巾解题 面试题 01.04. 回文排列

程序员面试金典字符串面试题 01.04 - 回文排列

#yyds干货盘点# LeetCode程序员面试金典:回文排列

最强解析面试题:回文数

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