这是我参与更文挑战的第9天,活动详情查看: 更文挑战
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词指字母相同,但排列不同的字符串。
排序,比较
public boolean isAnagram(String s, String t) {
//长度不相等,肯定就不是了
if (s.length() != t.length()) {
return false;
}
//转为char数组
final char[] sChars = s.toCharArray();
final char[] tChars = t.toCharArray();
//排序,异位词经过排序后,结果是一样的
// 排序的时间复杂度等nlogn
// O(logn) 的空间复杂度
Arrays.sort(sChars);
Arrays.sort(tChars);
//比较的时间复杂度为n
return Arrays.equals(sChars, tChars);
}
复杂度分析
-
时间复杂度:,
n为s的长度。 时间复杂度等于排序时间复杂度加上比较时间复杂度,结果等于 -
空间复杂度:,
n为s的长度,排序所需的空间。
字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
public List<List<String>> groupAnagrams(String[] strs) {
//key 为排序后异位词, value为对应的数组
Map<String, List<String>> map = new HashMap<String, List<String>>();
//遍历
for (String str : strs) {
// 转为数组
char[] array = str.toCharArray();
//排序,排序好之后,异位词是一样。
Arrays.sort(array);
String key = new String(array);
//保存到map中
List<String> list = map.getOrDefault(key, new ArrayList<String>());
//排序后的异位词的key是一样的,然后list保存没有排序后的异位词
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
复杂度分析
-
时间复杂度:,
n为s的长度。排序的时间复杂度为,当在for循环中排序,k代表的意思就是字符串最长的长度。 -
空间复杂度:排序所需的空间+
map存储的空间。