4.26 面试0102 判定互为字符串
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
题目分析
解法一:取巧
一行代码;
先转换为数组,排序后重新转为字符串比较
return Array.from(s1).sort().join('') === Array.from(s2).sort().join('')
解法二:hash表
在两个字符串size相等的情况下:
hash表储存键值对,key-value表示字符-对应出现的次数;
利用一个map,首先储存s1中的所有字符;
遍历s2
- 如果出现比s1中的key对应的value更多(size相等的情况下,有少的必有多的),进入else,return false
- 如果s2出现s1没有的key,value为undefined,同样进入else,return false
if (s1.length !== s2.length) {
return false
}
else {
var map = new Map();
// 把s1中的每个值存入map
// key-value为字符-对应出现的次数
for (let val of s1) {
if (!map[val]) {
map[val] = 1
}
else {
map[val]++
}
}
console.log(map);
for (let val of s2) {
if (map[val]) {
map[val]--
console.log(map);
} else {
// 注意:进入else有两种情况
// 1、s2某个字符出现次数比s1中相同的字符多,value减到0
// 2、s2出现了不属于s1中的字符map[val]为undefined
return false;
}
}
return true
}