题目名称:判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
0 <= len(s1) <= 100 0 <= len(s2) <= 100
解法
一、采用哈希表(对象)判断结构是否一致
- 注意题目有个前提条件是两个字符串长度一致
- 另一个前提条件是字符串中出现的字符的数量要严格对应
- 一个简单的思路就是使用哈希表存储每个字符出现个数,再判断结构是否一致
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = function(s1, s2) {
if(s1.length !== s2.length) return false
const map1 = getCount(s1)
const map2 = getCount(s2)
if(Object.keys(map1).length !== Object.keys(map2).length) return false
let res = true
for(let [k, v] of Object.entries(map1)){
if(v !== map2[k]){
res = false
break
}
}
return res
};
function getCount(str){
const map = {}
for(let v of str){
map[v] = map[v] ? map[v]+1 : 1
}
return map
}
二、排序法
- 直接排序看是否相等
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation1 = function(s1, s2) {
return s1.split('').sort().join('') === s2.split('').sort().join('')
};
三、一次循环就地删除法
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation2 = function(s1, s2) {
//长度不对等,肯定不行的
if(s1.length!=s2.length){
return false;
}
s2 = s2.split('');
//直接循环
for(let s of s1){
if(s2.indexOf(s)==-1){
return false;
}else{
// * 如果能够找到则就地删除
s2.splice(s2.indexOf(s),1);
}
}
return true;
};
测试用例
// 测试用例
let s1 = "abc", s2 = "acbd"
console.time('执行用时');
console.log(CheckPermutation1(s1, s2));
console.log(CheckPermutation2(s1, s2));
console.timeEnd('执行用时');
总结
- 一个对象的Object.entries返回这个对象键值对的数组
- 数组的sort方法如果参数不传,则使用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
- 字符串情况
- 数字情况
- 结论:通常情况下字符串可以不传参数,但数字数组如果涉及到比较大小必须传入compareFunction才能获得争取的排序结果
说明
- 本题解已同步GitHub地址,可以复制代码进行调试。
- 总结出了一套亲测有效的前端无痛刷题项目,有助于算法小白平稳入门,详见leetcode-js-roadmap,希望对从零开始刷题的前端小伙伴们带来帮助~
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!