01.04. 回文排列
题目:
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入: "tactcoa"
输出: true(排列有"tacocat"、"atcocta",等等)
第一点想法:(基本思路还是正确的)
开始的思路是:转化为数组处理,通过借助一个临时的tmp数组,tmp找不到a中的元素就添加进去,找得到元素,那就把这个元素从tmp中删除。最后如果tmp的长度是0或1,那就返回true
/**
* @param {string} s
* @return {boolean}
*/
var canPermutePalindrome = function(s) {
let a = s.split("");
let tmp = []
a.forEach(item => {
if(!tmp.some((element,index)=>{
return element === item
})){
tmp.push(item)
}
else{
tmp.splice(tmp.findIndex((element,index)=>{
return element === item
}),1)
}
})
return tmp.length===0 || tmp.length===1
};
使用对象来存储,而不是数组
这一点开始自己想到了,只是不知道应该怎么做。
/**
* @param {string} s
* @return {boolean}
*/
var canPermutePalindrome = function(s) {
let obj = {};
for(let i=0; i<s.length; i++){
let char = s[i];
if(obj[char])
delete obj[char]
else
obj[char] = 1;
}
return Object.keys(obj).length <= 1;
};
使用哈希表(感觉有点麻烦)
利用map对象进行字母统计,个数为奇数的字母2个以上(包括2),就无法构成回文串了。
这种思路还不如没有的时候(使用has方法)就set,有就delete
/**
* @param {string} s
* @return {boolean}
*/
var canPermutePalindrome = function(s) {
let map = new Map();
for (let i = 0; i < s.length; i++) {
map.set(s[i], (map.get(s[i]) || 0) + 1);
}
let cnt = 0;
for (let [key, value] of map) {
// 判断某个字母的计数是否是奇数
if (value % 2 === 1) {
cnt += 1;
}
// 只要有两个奇数个的字母,则无非构成回文串
if (cnt === 2) {
return false;
}
}
return true;
};
总而言之,言而总之,还是对象的存储方式最为简便