判定是否互为字符重排
题目
给定两个字符串 s1 和 s2,请编写一个程序
确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-permutation-lcci/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
1、循环 s1 字符串
2、对 s1 和 s2 进行字符替换,并累计各自的替换次数
3、若有一次不相等情况,说明存在其中一个字母个数不等
或者
1、循环 s1 字符串
2、定义两个相应的对象,存储各个字符出现的次数
3、最后遍历其中一个对象,对比同个字母出现的次数
或者
较好力扣题解
1、将 s1 、 s2 切割成数组
2、各自排序
3、再进行拼接
4、判断转换后的两个字符串相等即满足条件
题解
let CheckPermutation = function(s1, s2) {
if (s1.length !== s2.length) return false
for (const w of s1) {
// 循环 s1 字符串
let s1Count = 0, s2Count = 0
// 对 s1 和 s2 进行字符替换,并累计各自的替换次数
s1 = s1.replace(w, m => {
s1Count++
return ''
})
s2 = s2.replace(w, m => {
s2Count++
return ''
})
// 若有一次不相等情况,说明存在其中一个字母个数不等
if (s1Count !== s2Count) return false
s1Count = 0
s2Count = 0
}
return true
}
或者
let CheckPermutation = function(s1, s2) {
if (s1.length !== s2.length) return false
let s1Obj = {}, s2Obj = {}
for (let i = 0; i < s1.length; i++) {
// 循环 s1 字符串
// 定义两个相应的对象,存储各个字符出现的次数
if (!s1Obj[s1[i]]) {
s1Obj[s1[i]] = 1
} else {
s1Obj[s1[i]]++
}
if (!s2Obj[s2[i]]) {
s2Obj[s2[i]] = 1
} else {
s2Obj[s2[i]]++
}
}
// 最后遍历其中一个对象,对比同个字母出现的次数
for (const key in s1Obj) {
if (s1Obj[key] !== s2Obj[key]) {
// 若有不相等的情况,则说明存在同个字母个数不等
return false
}
}
return true
}
或者
较好力扣题解
let CheckPermutation = function(s1, s2) {
if (s1.length !== s2.length) return false
// 将 s1 、 s2 切割成数组
// 各自排序
// 再进行拼接
// 判断转换后的两个字符串相等即满足条件
return s1.split('').sort().join() === s2.split('').sort().join()
}