持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 2 天,点击查看活动详情
判定是否互为字符重排
给定两个字符串 s1
和 s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
思路分析
方法一
- 分析题目,可以得知两个字符串中含有的字符肯定是相同的;那么,它们排序后「不管是升序还是降序排列」得到的字符串一定是相同的;
- 将两个字符串排序,本方法采用的是先将字符串转换成数组,使用
sort()
方法进行排序后,再使用join()
方法转换成字符串; - 判断步骤二得到的两个字符串是否相同即可。
方法二
- 如果两个字符串的长度不相同,那么返回值一定是
false
; - 两个字符串的长度相同时,若要满足题目条件,那么两个字符串中每个字符出现的次数肯定是相同的;
- 定义
map1
和map2
来存储两个字符串中每个字符出现的次数,遍历两个字符串得到map1
和map2
的结果; - 以
map1
或者map2
的key
做遍历,判断map1
和map2
中每个key
对应的value
值是否相同。
AC 代码
方法一
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = function(s1, s2) {
return s1.split('').sort().join() === s2.split('').sort().join()
};
结果:
- 执行结果: 通过
- 执行用时:68 ms, 在所有 JavaScript 提交中击败了13.90%的用户
- 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了43.87%的用户
- 通过测试用例:23 / 23
方法二
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = function(s1, s2) {
if(s1.length !== s2.length) return false
const map1 = {}
const map2 = {}
for(let i = 0; i < s1.length; i++) {
if(map1[s1[i]]) {
map1[s1[i]] += 1
} else {
map1[s1[i]] = 1
}
}
for(let i = 0; i < s2.length; i++) {
if(map2[s2[i]]) {
map2[s2[i]] += 1
} else {
map2[s2[i]] = 1
}
}
return Object.keys(map1).every((key) => map1[key] === map2[key])
};
结果:
- 执行结果: 通过
- 执行用时:72 ms, 在所有 JavaScript 提交中击败了7.36%的用户
- 内存消耗:41.3 MB, 在所有 JavaScript 提交中击败了5.18%的用户
- 通过测试用例:23 / 23