leetcode-383-Ransom Note(以空間換時間)
題目描述:
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
要完成的函數:
bool canConstruct(string ransomNote, string magazine)
說明:
1、古時候……綁架者會寫勒索信,要求給贖金,不然就撕票。但為了不被認出自己的字跡,就會從報紙上剪出文字,拼湊成一封勒索信。這道題給定兩個字符串,第一個是綁匪要寫的勒索信的字符串,第二個是報紙上能提供的文字的字符串,要求判斷能不能從第二個字符串中構建出第一個字符串。
第二個字符串中的每個字母只能用一次,兩個字符串中只有小寫字母。
2、這道題有三種做法:
①雙重循環,第一個字符串碰到一個字符就去找第二個字符串中有沒有,這是最慢最沒有效率的做法。
②先排序,再比較,這種做法時間復雜度比①小,但也不快。
③以空間換時間,定義一個長度為26的vector,遍歷一遍第二個字符串,統計所有字母的出現次數,再遍歷一遍第一個字符串,逐個在vector中相應位置上減1。
最後再遍歷一遍vector,看是否存在小於0的數值,如果有,返回false。如果沒有,返回true。
時間復雜度是O(n)
我們采用第三種做法,構造代碼如下:
bool canConstruct(string ransomNote, string magazine) { vector<int>count(26,0); for(char i:magazine)//統計第二個字符串中所有的字母出現次數 count[i-‘a‘]++; for(char i:ransomNote)//在對應的位置上減去1 count[i-‘a‘]--; for(int i:count)//遍歷一遍vector,看是否存在小於0的數值 { if(i<0) return false; } return true; }
上述代碼實測24ms,beats 89.66% of cpp submissions。
leetcode-383-Ransom Note(以空間換時間)