给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入:“tactcoa”
输出:true(排列有"tacocat"、“atcocta”,等等)
解法加心得如下:
/**
* 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
* 回文串不一定是字典当中的单词。
*
* @author 雷振 判断回文字符串
*/
public class palindrome {
public static void main(String[] args) {
System.err.println(canPermutePalindrome("aabbccccc"));
// System.err.println(canPermutePalindrome("tactcoa"));
System.err.println(canPermutePalindrome(""));
}
public static boolean canPermutePalindrome(String s) {
if (s == null || s == "")
return false;
// 做题思路是利用set集合的不可重复性,和包含性
// 第一步先将字符串转换成字符数组
char[] c1 = s.toCharArray();
// 第二步再新建一个set集合,集合里面放char类型的数据,放String就不行。
Set<Character> set = new HashSet<>();
// 第三步循环便利字符数组
for (char c : c1) {
// 第四步 确定set集合里面是否已经添加重复字符,如果重复添加,也就是集合已经包含
// 需要添加的字符就将该字符删除
if (set.contains(c)) {
set.remove(c);
} else {
// 否则就重新添加
set.add(c);
}
}
// 第五步 返回一个值,最后结果是set集合之剩下一个字符或者空
// 回文字符串基本是以一个字符为中心前后对应的,只要有对应的都被删除了
// 如回文ababcabab a和b字符重复了就会被删除,只剩下c一个字符
// 如非回文aeabcabd a和b字符重复了就会被删除,还剩下e、c和d三个字符
return set.size() <= 1;
}
}