public boolean isPalindrome(String s) {
if (s == null || s.isEmpty()) {
return true;
}
int l = 0, r = s.length() - 1;
while (l < r) {
// find left alphanumeric character
if (!Character.isLetterOrDigit(s.charAt(l))) {
l++;
continue;
}
// find right alphanumeric character
if (!Character.isLetterOrDigit(s.charAt(r))) {
r--;
continue;
}
// case insensitive compare
if (Character.toLowerCase(s.charAt(l)) == Character.toLowerCase(s.charAt(r))) {
l++;
r--;
} else {
return false;
}
}
return true;
}
public static List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
if (strs == null) return result;
// one key to multiple value multiMap
Map<String, ArrayList<String>> multiMap = new HashMap<String, ArrayList<String>>();
for (String str : strs) {
char[] strChar = str.toCharArray();
Arrays.sort(strChar);
String strSorted = String.valueOf(strChar);
if (multiMap.containsKey(strSorted)) {
ArrayList<String> aList = multiMap.get(strSorted);
aList.add(str);
multiMap.put(strSorted, aList);
}
else {
ArrayList<String> aList = new ArrayList<String>();
aList.add(str);
multiMap.put(strSorted, aList);
}
} // add List group to result
Set<String> keySet = multiMap.keySet();
for (String key : keySet) {
ArrayList<String> aList = multiMap.get(key);
Collections.sort(aList);
result.add(aList);
}
return result;
}