1. 程式人生 > >字串匹配(刪除指定字元)/codewars練習

字串匹配(刪除指定字元)/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

' and 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);
}