Valid Anagram, Group Anagrams

Valid Anagram

Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = “anagram”, t = “nagaram”, return true.
s = “rat”, t = “car”, return false.
Note:
You may assume the string contains only lowercase alphabets.

HashMap Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static boolean isAnagram(String s, String t) {
s.toLowerCase();
t.toLowerCase();
if(s.length()!=t.length()) return false;
HashMap<Character, Integer> map=new HashMap<Character, Integer>();
for(int i=0; i<s.length();i++){
if(!map.containsKey(s.charAt(i))){
map.put(s.charAt(i), 1);
}
else map.put(s.charAt(i), map.get(s.charAt(i))+1);
}
for(int i=0;i<t.length();i++){
if(map.containsKey(t.charAt(i))){
if(map.get(t.charAt(i))>=1){
map.put(t.charAt(i), map.get(t.charAt(i))-1);
}
else return false;
}
else if(!map.containsKey(t.charAt(i))) return false;
}
return true;
}

Sort Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public boolean isAnagramSort(String s, String t) {
if (s == null || t == null) {
return (s == null && t == null) ? true : false;
}
if (s.equals(t)) {
return true;
}
if (s.length() != t.length()) {
return false;
}
char[] s1 = s.toCharArray();
char[] t1 = t.toCharArray();
Arrays.sort(s.toCharArray());
Arrays.sort(t.toCharArray());
return new String(s1).equals(new String(t1)) ? true : false;
}

Group Anagrams

Given an array of strings, group anagrams together.
For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Return:
[
[“ate”, “eat”,”tea”],
[“nat”,”tan”],
[“bat”]
]
Note:
For the return value, each inner list’s elements must follow the lexicographic order.
All inputs will be in lower-case.

Sort + Hashmap Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> dict = new HashMap<String, List<String>>();
for (int i = 0; i < strs.length; i++) {
String s = strs[i];
char[] chars = s.toCharArray();
Arrays.sort(chars);
String sortedString = String.valueOf(chars);
if (dict.containsKey(sortedString)) {
dict.get(sortedString).add(s);
} else {
List<String> list = new ArrayList<String>();
list.add(s);
dict.put(sortedString, list);
}
}
List<List<String>> res = new ArrayList<List<String>>();
for (List<String> list : dict.values()) {
if (list.size() >= 1)
Collections.sort(list);
res.add(list);
}
return res;
}