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