给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
方法一:排序
class Solution {
public:
bool isAnagram(string s, string t) {
int size1 = s.size();
int size2 = t.size();
//首先计算字符串 s 和 t 的大小,如果两字符串的大小不相等,直接返回false
if(size1 != size2){
return false;
}
//如果两字符串的大小是相等的
//对两字符串进行排序,判断排序后的两字符串是否是相等的
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}
};
时间复杂度:O(nlogn),其中 n 为 s 的长度。排序的时间复杂度为 O(nlogn),比较两个字符串是否相等时间复杂度为 O(n),因此总体时间复杂度为 O(nlogn+n)=O(nlogn)。
空间复杂度:O(logn)。排序需要 O(logn) 的空间复杂度。
方法二:哈希表
class Solution {
public:
bool isAnagram(string s, string t) {
int m = s.size();
int n = t.size();
//首先计算字符串 s 和 t 的大小,如果两字符串的大小不相等,直接返回false
if(m != n){
return false;
}
//如果两字符串的大小是相等的
//遍历字符串s,将字符串s中各个字母对应的下标处的元素+1
vector<int> table(26,0);
for(int i = 0;i < m; ++i){
table[s[i]-'a']++;
}
//遍历字符串t,将字符串t中各个字母对应的下标处的元素-1
//如果-1之后的值小于0,说明两字符串不相同,必有(<0)的去情况
for(int i = 0;i < n; ++i){
table[t[i]-'a']--;
if(table[t[i]-'a'] < 0){
return false;
}
}
return true;
}
//时间复杂度:O(n),其中 n 为 s 的长度。
//空间复杂度:O(S),其中 S 为字符集大小,此处 S=26
};