Leetcode--383 贖金信(JS版)

迷途小學生發表於2018-12-03

Hello,大家好。在這裡我會不定期分享一下自己的leetcode解題思路,希望能夠與大家一起討論一起進步~~

先來共享一下原題:

給定一個贖金信 (ransom) 字串和一個雜誌(magazine)字串,判斷第一個字串ransom能不能由第二個字串magazines裡面的字元構成。如果可以構成,返回 true ;否則返回 false。

(題目說明:為了不暴露贖金信字跡,要從雜誌上搜尋各個需要的字母,組成單詞來表達意思。)

注意:

你可以假設兩個字串均只含有小寫字母。

canConstruct("a", "b") -> false canConstruct("aa", "ab") -> false canConstruct("aa", "aab") -> true

程式碼我先不著急放,我先說一下我個人的解題思路吧。其實根據題目個人感覺有幾點是應該要注意的:(1)magazines的字元不能重複使用,所以使用過的字元必須剔除掉,不能再用來 匹配。(2)注意極限條件,當ransom為空竄的時候,應該必然返回true.而當magazines為空竄時應該必然返回false(除了ransom與magazines同時為空的情況)

針對第一個注意的要點,我解決的思路是通過string.indexOf來判斷是否包含當前字元,然後通過slice來修改magazines字串,把匹配過的字元剔除。

下面是參考程式碼:

/**
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function(ransomNote, magazine) {
    if(ransomNote.length > magazine.length){
        return false;
    }
    if(!ransomNote){
        return true;
    }
    let index;
    for(let i=0,len=ransomNote.length;i<len;i++){
       //包含這個字元
       if(magazine.indexOf(ransomNote[i])>-1){
           index = magazine.indexOf(ransomNote[i]);
           magazine = magazine.slice(0,index) +  magazine.slice(index+1,magazine.length);
       }else{
           return false;
       }
    }
    return true;
};
複製程式碼

如果有更好的方法,歡迎大家交流學習,謝謝。

相關文章