LeetCode --- 字符串系列 --- 判定是否互为字符重排

判定是否互为字符重排

题目

给定两个字符串 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()
}

posted @ 2020-04-08 19:55  青S衫%  阅读(629)  评论(0编辑  收藏  举报