01.02. 判定是否互为字符重排
-
- 题目:
- 知识补充
-
- 两个重排的字符串应该具有相同的字符,但顺序不同。你可以让它们的顺序一样吗?
-
- 代码
- 其他方法
-
- 第一次想到的方法(最笨的方法)
- 题解中看到的方法
题目:
给定两个字符串 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){
let tmp1 = [...s1].sort()
let tmp2 = [...s2].sort()
for(let i =0; i < tmp1.length;i++){
if(tmp1[i] !== tmp2[i]){
return false
}
}
return true
}
return false
//改进
//没必要一个字母一个字母的比较
//这里使用join(),是我没有想到的,
//join() 方法用于把数组中的所有元素放入一个字符串。
//元素是通过指定的分隔符进行分隔的。参数是可选的,这里直接转为字符串不需要参数
return s1.split('').sort().join() === s2.split('').sort().join();
};
其他方法
第一次想到的方法(最笨的方法)
本是想借助散列表的思想,但是发现好像使用的并不是很正确。
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = function(s1, s2) {
if(s1.length == s2.length){
let arr1 = new Object;
let arr2 = new Object;
for(let str of s1){
if(!arr1[str]){
arr1[str] = 1
}else{
arr1[str]++
}
}
for(let str of s2){
if(!arr2[str]){
arr2[str] = 1
}else{
arr2[str]++
}
}
for(let str of s2){
if(arr1[str] !== arr2[str] && (arr1[str] !== undefined || arr2[str] !== undefined)){
return false
}
}
return true
}else{
return false
}
};
题解中看到的方法
思想是查找s2中有没有一样字母,没有肯定false,有就删除,然后循环
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var CheckPermutation = 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;
};