字串匹配(刪除指定字元)/codewars練習
Write function scramble(str1,str2)
that returns true
if a portion of str1
characters can be rearranged to match str2
, otherwise returnsfalse
.
For example:str1
is 'rkqodlw'
and str2
is 'world'
the output should returntrue
.str1
is 'cedewaraaossoqqyt'
and str2
is 'codewars'
should returntrue
.
str1
is 'katas
str2
is 'steak
' should return false
.Performance needs to be considered
將字串str1重新排序以匹配字串str2,匹配成功函式返回true,失敗則返回false。(只考慮a~z的小寫字母,沒有標點或數字)
開始的思路是遍歷str2中的每一個字元,對比str1中是否存在,存在則移除,不存在返回false。
for(var i=str2.length;i--;){var n = str1.indexOf(str2[i]);
if(n==-1){return false;}
else{str1=str1.substring(0,n)+ str1.substring(n+1);} //substring()方法刪除指定字元
}
return true;
}
function scramble(str1, str2) {
for(var i=str2.length;i--;){
if(str1.replace(str2[i],"")==str1){ return false;}
str1 = str1.replace(str2[i],""); //replace()方法刪除指定字元
}
return true;
}
因為要考慮到效能,提交以上答案不能通過,只能從其它角度重新考慮。只要字元的個數可以匹配,就是返回true。建立物件,屬性名為str2中的字元,屬性值為此字元的個數。
function scramble(str1, str2) {
var map={};
for(var i = str1.length;i--;) {
map[str1[i]] ? map[str1[i]]++ : map[str1[i]]=1;
}
for(var i = str2.length;i--;) {
if(!map[str2[i]]) return false;
map[str2[i]]--;
}
return true;
}
//再貼一段更簡單的程式碼(利用陣列的reduce方法將字元資訊放入occurences物件中)
function scramble(str1, str2) {
let occurences = str1.split("").reduce((obj, cur) => { obj[cur] ? obj[cur]++ : obj[cur] = 1; return obj; }, {});
return str2.split("").every((character) => --occurences[character] >= 0);
}