LeetCode面试题01.02 判断是否为字符重排

题目:
给定两个字符串 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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值