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
Solution:
- hashtable:asdf
public bool CanConstruct(string ransomNote, string magazine) { int magLength = magazine.Length; int ranLength = ransomNote.Length; if(ranLength>magLength) return false; if(ranLength==0) return true; Hashtable hashtable = new Hashtable(); for(int j = 0; j< ranLength;j++) { if(hashtable.ContainsKey(ransomNote[j])) { int temp = (int)hashtable[ransomNote[j]]; temp++; hashtable[ransomNote[j]] = temp; } else { hashtable.Add(ransomNote[j],1); } } for(int i= 0; i< magLength;i++) { if(hashtable.ContainsKey(magazine[i])) { int temp = (int)hashtable[magazine[i]]; if(--temp <=0) hashtable.Remove(magazine[i]); else hashtable[magazine[i]] = temp; } if(hashtable.Count==0) return true; } return false; }
- 2 pointer & sorting
public bool CanConstruct(string ransomNote, string magazine) { int magLength = magazine.Length; int ranLength = ransomNote.Length; if(ranLength>magLength) return false; if(ranLength==0) return true; var charR = ransomNote.ToCharArray(); var charM = magazine.ToCharArray(); Array.Sort(charR); Array.Sort(charM); int i = 0; int j = 0; while(j<magLength && i< ranLength) { if(charR[i] == charM[j]) { i++; j++; } else if(charR[i] < charM[j]) { return false; } else j++; } return (i== ranLength); }