242. 有效的字母异位词 - 力扣(LeetCode)
题目描述
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的 字母异位词
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
字母异位词的定义:
题解
解法一:排序
把字符串进行排序,比较两个字符串是否完全相同。如果完全相同就是字母异位词
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}
};
解法二:使用哈希表
当遇到要查询一个元素是否在集合中时,就要想当使用哈希表
当要使用哈希表时,要考虑三种数据结构 数组,set,map
在这道题中,我们使用普通数组来统计字符串s中每个字母出现的频率,比如:有一个a,就在0号位置上加1,有一个b,就在1号位置上加1
这个位置是怎么算出来的呢?
用该字母-‘a’ 得到的数 因为为自动转换为ASCII码值 ,'a'-'a'=0;'b'-'a'=1..
再统计字符串t中每个字母出现的频率,在hash数组中然后减去,比如:有一个a,就在0号位置上减1,有一个b,就在1号位置上减1
如果两个字符串的组成完全相同,那么所有字母出现的频率都应该相同
那么最终这个hash数组全部元素都应该为0
如果有地方不为0,那么说明这两个字符串组成不同
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[26]={0}; //创建哈希表
for(int i=0;i<s.size();i++){
hash[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
hash[t[i]-'a']--;
}
for(int i=0;i<sizeof(hash)/sizeof(hash[0]);i++){
if(hash[i]!=0)return false;
}
return true;
}
};
易错点:
我在第一遍书写时,最后在遍历hash数组时,我直接写了hash.size(),这是一种错误的写法!hash数组是一个原生数组,不是STL容器,没有size()方法,只能用sizeof(hash)/sizeof(hash[0])