题目链接
LeetCode-242. 有效的字母异位词
题目描述
题解
题解一(Java)
作者:@仲景
首先,满足条件的情况下,两个字符串的长度一定是相等的,不相等一定不满足条件
使用Hash表来存储字符串s中各个字符出现的次数
遍历字符串t,查看每个字符在hash表中出现的次数,如果次数>0,就减1,如果≤0,说明次数已经没有了(或者没存在过),那么两个字符串一定是不满足条件的,直接返回false
如果遍历完字符串t都没有返回false,那么一定满足条件,直接返回true
时间复杂度:O(N)
空间复杂度:O(N) ,N为字符串s中不同字符的个数
class Solution {
public boolean isAnagram(String s, String t) {
// 长度不一样就一定不是
if (s.length() != t.length())
return false;
// 创建一个hash表
HashMap<Character, Integer> map = new HashMap<>();
// 遍历字符串s并添加到hash表中
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);
}
// 遍历字符串t,查找在hash表中不存在的字符
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
// 获取c在hash表中出现的次数
Integer count = map.getOrDefault(c, 0);
// 如果不存在,则直接返回false
if (count <= 0)
return false;
else
map.put(c, count - 1);
}
// 全部存在,返回true
return true;
}
}
题解二(Java)
作者:@仲景
因为题目说明字符串中只有小写字母,所以只需要一个26空间的数组就可以代替hash表来存储字符串中各个字符出现的次数
原理和题解一是一样的
时间复杂度:和题解一相同
空间复杂度:O(N),N=26
class Solution {
public boolean isAnagram(String s, String t) {
// 长度不一样就一定不是
if (s.length() != t.length())
return false;
// 创建一个26位的数组
int[] arr = new int[26];
// 遍历字符串s
for (int i = 0; i < s.length(); i++) {
arr[s.charAt(i) - 'a']++;
}
// 遍历字符串t
for (int i = 0; i < t.length(); i++) {
arr[t.charAt(i) - 'a']--;
if (arr[t.charAt(i) - 'a'] < 0)
return false;
}
return true;
}
}