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;
};