#383. Ransom Note
題目描述
給你兩個字串ransomNote
和magazine
,回傳true
如果ransomNote
可以從magazine
中的字元組成,反之則回傳false
。
每一個magazine
中的字母只能被ransomNote
使用一次。
限制條件
- 1 <=
ransomNote.length
,magazine.length
<= 10^5 ransomNote
和magazine
都是由小寫字母組成。
解題思路
Character Counting
假設magazine
中出現的字元為正值,ransomNote
中出現的字元為負值,則magazine
的字元可以組成ransomNote
的話,magazine
減去ransomNote
的每個字元值會大於等於0
。
public class Solution {
public bool CanConstruct(string ransomNote, string magazine) {
//a = 97;
var letters = new int[26];
foreach(char i in magazine){
int pos = i - 97;
letters[pos]++;
}
foreach(char i in ransomNote){
int pos = i - 97;
letters[pos]--;
}
foreach(int i in letters){
if(i<0) return false;
}
return true;
}
}
複雜度分析:
- 時間複雜度:花費總時間為( m + n + 26 ),因此時間複雜度為O(m+n)。
- 空間複雜度:使用空間沒有增加,因此為O(1)。
Hash Table
同Character Counting的解題概念,只是換成使用Hash Table來儲存字元。
public class Solution {
public bool CanConstruct(string ransomNote, string magazine) {
Hashtable ht = new Hashtable();
foreach(char i in magazine){
if(ht.Contains(i)==false) ht.Add(i,1);
else ht[i] = (int)ht[i] + 1;
}
foreach(char i in ransomNote){
if(ht.Contains(i)==false) ht.Add(i,-1);
else ht[i] = (int)ht[i] - 1;
}
foreach(DictionaryEntry i in ht){
if((int)i.Value<0) return false;
}
return true;
}
}
複雜度分析:
- 時間複雜度:同Character Counting所花費的時間,因此為O(m+n)。
- 空間複雜度:雖然使用了Hashtable,但是最多也只會儲存26個字母,所以空間複雜度應為O(1)。
學習重點
- 字元操作。
- Hash Table應用。