面试题 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. 回文排列的主要内容,如果未能解决你的问题,请参考以下文章