题目描述
难度 简单
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-permutation-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
题意说的是:给定一个字符串,判断这个字符串重新排列后能否成为回文串。
* 提示1:你不必且也不应该生成所有的排列。这将极为低效。
* 提示2:作为回文排列的字符串有什么特征?
答:通过规律发现特征,通过特征实现算法。特点1).回文串是左右对称的,即两两一对;特点2).最多允许一个字符不在对称序列内,即中间那个字符。由两特征可以推出,两两相消,最终只剩0或者1个字符时,则表明此字符串可通过重排列后组成回文串。
* 提示3:你试过散列表吗?你应该能把它降到O(N)的时间。
答:Set集合、队列都可以实现,主要是性能上的不同
* 提示4:使用位向量可以减少空间使用吗?
这道题与[LeetCode]20. 有效的括号思路有部分相似之处。
代码实现
算法实现1
class Solution {
public boolean canPermutePalindrome(String s) {
if(s == null) return false;
Set<Character> datastructure = new HashSet<Character>();
char[] chars = s.toCharArray();
for (char c : chars) {
if (datastructure.contains(c)) {
datastructure.remove(c);
} else {
datastructure.add(c);
}
}
return datastructure.size() <= 1;
}
}
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:36.4 MB, 在所有 Java 提交中击败了5.10% 的用户
通过测试用例:27 / 27
算法实现2
class Solution {
public boolean canPermutePalindrome(String s) {
if(s == null) return false;
//Set<Character> datastructure = new HashSet<Character>();
Queue<Character> datastructure = new LinkedBlockingQueue<>();
char[] chars = s.toCharArray();
for (char c : chars) {
if (datastructure.contains(c)) {
datastructure.remove(c);
} else {
datastructure.add(c);
}
}
return datastructure.size() <= 1;
}
}
执行结果:通过
执行用时:4 ms, 在所有 Java 提交中击败了43.97% 的用户
内存消耗:36.5 MB, 在所有 Java 提交中击败了5.10% 的用户
通过测试用例:27 / 27
记录与总结,2021年 12月 04日 星期六 02:17:55 CST。