Given two strings s and t , return true if t is an anagram of s*, and* false otherwise .
Input: s = "rat", t = "car" Output: false
Input: s = "anagram", t = "nagaram" Output: true
I decided to tackle this question using harsh maps. Basically the hash is populated with the string s and its index. To check if a string is an anagram the algrothms checks to see if string t is in hash map and returns true. My solution isn't working, can some please assist me ?
func isAnagram(_ s: String, _ t: String) -> Bool {
//anagram "nagaram"//
//decalre hashmap
// populate hasmap with s
// check if string in t is in s
var result = [Character:Int]()
for (index,element) in s.enumerated(){
result [element] = index
}
for words in t {
if result.keys.contains(words){
return true
}
}
return false
}
Eager to jump into high difficulty I see. That is a good spirit.
Now, since you've figured what it returns (true), maybe you want to look into how/why it does that. You wrote that it's because the value of s is in the hash map. That is not false, but hardly useful. Try this instead
What exactly is in hash map? Is it the actual string s? Is it all the possible anagram of s? Are they all characters of s?
What does the checking using hash map later tell you? Does it mean word is an anagram of s? Does it mean word is the same string as s? Does it mean s contains a character word somewhere in there?
Is it enough to tell whether t is an anagram of s after checking word?
You can also look into other cases if you'd like. More scenarios are usually a good thing. It helps making sure you're not missing something.
Also, before jumping into coding, I'd suggest that you try using pen & paper. See what you are doing manually; what you are keeping track of, what you write down, look at, etc. Such a method can be helpful at times like this.
Hmm, I’m not sure about that. I hardly see any technical interviews that don’t have any writing tools. At the very least, you could write something on a whiteboard if needed.
There are also cases where you are asked about “simple” algorithms. Those simply require practice, I guess?
There are a lot of things wrong with your function. First of all, it doesn't make sense to create a dictionary (result) if you only read the keys (result.keys.contains(words)). You never read the values.
Secondly, the indices of the characters in the two words have no bearing on whether they are anagrams or not.
All your function does is test whether the two words have a single character in common.
What you need to test for is if the two words contain the same characters and the same number of each of the characters:
func isAnagram(_ s: String, _ t: String) -> Bool {
// Each key in the dictionaries represents a character in the string.
// The values represent the occurrences of the characters in the string.
var sDictionary: [Character: Int] = [:]
for character in s {
sDictionary[character, default: 0] += 1
}
var tDictionary: [Character: Int] = [:]
for character in t {
tDictionary[character, default: 0] += 1
}
return sDictionary == tDictionary
}