给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
我的解法:首先定义一个长度为26的int数组flag,用于标记字符串中字母出现的次数。对于字符串s中的字母,flag在字母下标对应的元素位置+1;对于字符串t中的字母,flag在字母下标对应的元素位置-1。最后遍历flag,若所有元素都为0,说明t是s的字母异位词,反之则不是。
时间复杂度:O(n),空间复杂度:O(n)
class Solution {
public boolean isAnagram(String s, String t) {
int[] flag = new int[26];
char[] ss = s.toCharArray();
for (char c : ss) {
flag[c - 'a']++;
}
char[] tt = t.toCharArray();
for (char c : tt) {
flag[c - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (flag[i] != 0) {
return false;
}
}
return true;
}
}
改进算法:首先判断s和t的长度是否相同,若不同则说明t不是s的字母异位词。然后同时遍历s和t,对于字符串s中的字母,flag在字母下标对应的元素位置+1;对于字符串t中的字母,flag在字母下标对应的元素位置-1。最后判断flag中是否所有元素都为0。
时间复杂度:O(n),空间复杂度:O(n)
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] flag = new int[26];
for (int i = 0; i < s.length(); i++) {
flag[s.charAt(i) - 'a']++;
flag[t.charAt(i) - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (flag[i] != 0) {
return false;
}
}
return true;
}
}