题目:
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
解题思路:
1、首先,我想到的是通过对应s1和s2每个字符通过ascii码值来差值求和计算,如果最后的结果不等于0,那结果就是false。不过经过验证是不可行的。比如:“ac”, “bb”
。
2、然后想的就是通过map集合来实现。对s1和s2中的字符同时遍历,如果s1[i]
在集合中,则该字符个数+1;如果s2[i]
也在集合中,则该字符个数-1。如果不在,则设置key = s2[i], value = -1
。其实就是统计两个字符串中,相同字符出现的次数是否相同。
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = function(s1, s2) {
if(s1.length !== s2.length){return false} //如果两个字符串长度不相同,直接返回false
let map = new Map(); //定义一个map
for(let i = 0;i<s1.length;i++){ //此时s1.length = s2.length
if(!map.has(s1[i])){ // 如果集合中没有当前字符
map.set(s1[i], 1); // 设置key=s1[i],value=1
}else{
map.set(s1[i], map.get(s1[i]) + 1); //有当前字符,直接value+1
}
// 同时对字符串s2也进行判断
if(!map.has(s2[i])){ //如果没有当前字符(不是说s1中没有,也有可能是还没遍历到)
map.set(s2[i], -1) // 反向设置value = -1
}else{
map.set(s2[i], map.get(s2[i])-1); //如果已经有了,则value - 1
}
}
for(let [key, value] of map){ //最后遍历一遍集合,如果有value !== 0 的,说明肯定有不符合的字符,所以直接返回false
if(value !==0 ){
return false
}
}
return true;
};