🎀 The Problem
Given two strings s and t, return true if t is an anagram of s, and false otherwise.
Example:
Input: s = "anagram", t = "nagaram"
Output: true
👩💻 My Answer
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
HashMap map = new HashMap();
char counter = 0;
int scount = 0, tcount = 0;
while (counter < s.length()) {
char letter = s.charAt(counter);
if (!map.containsKey(letter)) {
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == letter)
scount++;
if (t.charAt(i) == letter)
tcount++;
}
}
if (scount != tcount)
return false;
else
map.put(letter, scount);
counter++;
}
return true;
}
}
Pro & Con
- ✖️ Runtime & Memory
💋 Ideal Answer
Approach - "Array"
I watched the YouTube video and found that it's faster if I use int instead of a HashMap. Here is my array method.
New Code
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
int[] scount = new int[26];
int[] tcount = new int[26];
for (int i = 0; i < s.length(); i++) {
scount[s.charAt(i)-'a']++;
tcount[t.charAt(i)-'a']++;
}
for (int i = 0; i < 26; i++) {
if (scount[i] != tcount[i])
return false;
}
return true;
}
}
This beats only 57%, so I was wondering what the ideal answer is. Then, I found the faster answer in LeetCode problem.
public class Solution {
public boolean isAnagram(String s, String t) {
int[] alphabet = new int[26];
for (int i = 0; i < s.length(); i++) alphabet[s.charAt(i) - 'a']++;
for (int i = 0; i < t.length(); i++) alphabet[t.charAt(i) - 'a']--;
for (int i : alphabet) if (i != 0) return false;
return true;
}
}
💡 What I Learned
Use array instead of HashMap to make it faster.
int[] alphabet = new int[26];
I used to use two arrays for s and t. But use ONE instead.
If you find the letter in s, increment;t while the letter in t decreases the count in the array.
Top comments (0)