- 解题思路来源于如下文章
- 题目
- 解题思路
暴力解容易写,但想要降低时间复杂度还得用下面这种方法。
①因为所给的字符串中的字符的范围是a~z,所以定义一个长度为26的数组count,这个数组的下标由字符串的每个字符减去'a'得到的相对数值确定,这个相对数值的范围:0~25。(因为最小是'a' - 'a' =0,最大是'z' - 'a' =25)。
②先用count记录第一个字符串s中各字符出现的次数,再用count来减去第二个字符串t中各字符出现的次数;
③最后遍历数组count,如果有一个count[i] != 0,说明有一个字符出现频次不同,所以直接返回false,遍历完数组还不return false就返回true。
- 代码
/**
* 242. 有效的字母异位词 字典解法
* 时间复杂度O(m+n) 空间复杂度O(1)
*/
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for (int i = 0; i < s.length(); i++) {
record[s.charAt(i) - 'a']++; // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}
for (int i = 0; i < t.length(); i++) {
record[t.charAt(i) - 'a']--;
}
for (int count: record) {
if (count != 0) { // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return false;
}
}
return true; // record数组所有元素都为零0,说明字符串s和t是字母异位词
}
}