[题目来源](242. 有效的字母异位词 - 力扣(LeetCode))

image-20230405230509034

常规的方法:对于两个字符串进行排序,然后判断两个字符串是否相等(可以直接判断字符串是否相等,if s==t return true)

一种奇妙的思路:建立字符表

两个字符串中的字符无非就是26个字母。建立一个容量为26的数组,内容全部初始化为0.如果s中存在某一字母,就在相应的位置上+1,如果t中存在某一字母,就在相应的位置上-1,最后如果数组中还是全为0,说明s和t中的内容正好相互抵消,否则说明s和t不是有效的字母异位词。(感觉有点像摩尔投票法中的支持者打架)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool isAnagram(string s, string t) {
int num[26]={0};
if(s.length()!=t.length())
return false;
for(int i=0;s[i]!='\0';i++){
num[s[i]-'a']++;
num[t[i]-'a']--;

}
for(int i=0;i<26;i++)
if(num[i]!=0)
return false;
return true;
}

弊端:必须面对已知的字符,建立完整的字符表,比如已知含有的字符无非是26个字母。如果按照题目的进阶,unicode字符量很大,且不知道所有的字符是什么,无法建立字符表。