标签:
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:
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; }
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); }
标签:
原文地址:http://www.cnblogs.com/renyualbert/p/5782452.html