iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

CodeWars 題目

Link

難度

5 kyu

題目

驗證 str1 是否可以排列成 str2,如果可以返回 true,否則返回 false。

實作

function scramble(str1, str2) {
    const counter = {};
    
    for (let i = 0; i < str1.length; i++) {
        if(counter[str1[i]]){
          counter[str1[i]]++;
        }else{
          counter[str1[i]] = 1;
        }
    }

    for (let i = 0; i < str2.length; i++) {
        if (!counter[str2[i]]) {
            return false;
        } else {
            counter[str2[i]]--;
        }
    }

    return true;
}

直接使用 counter 技巧,首先紀錄 str1 存在哪些字元。

利用 for 迴圈迭代,counter 物件紀錄存在的字元以及個數。
if(counter[str1[i]]) 如果條件成立,把物件中的 value++;否則新增該元素並且賦值為 1。

然後一樣 for 迴圈跑 str2,與第一個是相反做法;
如果 if (!counter[str2[i]]) 條件成立,則表示 str1 不存在該字元,直接返回 false。

迭代完成若都沒有跳出,返回 true。

他人的解法

function scramble(str1, str2) {
  let occurences = str1.split("").reduce((arr, cur) => { arr[cur] ? arr[cur]++ : arr[cur] = 1; return arr; }, {});
  return str2.split("").every((character) => --occurences[character] >= 0);
}

最佳解也是同樣概念的解法。
reduce 這段以空物件來迭代 str1 的陣列,最後返回一個紀錄有哪些字元的物件 occurences。
str2 以 every 驗證條件是否完全符合,只有完全符合才會返回 true,否則都是 false。

心得

雖然邏輯相通,大抵上做的事也都一樣。
但最佳解除了更加簡潔之外,也不會難讀,程式還是容易就能看懂。


上一篇
Longest Common Subsequence
下一篇
Weight for weight
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言