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;
};
複製程式碼
如果有更好的方法,歡迎大家交流學習,謝謝。