题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:输入: s = “rat”, t = “car”
输出: false
说明:你可以假设字符串只包含小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
最笨的办法是对s和t中的字母按字母顺序排序,但该方法比较费时间,此处介绍采用map的方式
1.因为共有26个字母,所以采用有26个元素的数组,字母与数组下标存在一一对应关系,对应关系又多种,比如字母a可以放在下标为‘a’%26的元素中,也可也放在‘a’ - 97的元素中
2.题中有两个字符串,其中一个字符串负责对其对应的数组元素做++操作,一个–操作,这样最后数组中的元素应该全是0
需要考虑的特殊情况:
1.输入参数的合法性
2.两个字符串长度不一样
3.字母有大写字母和小写字母,leetcode中有其他的处理方式,有些没有考虑大写字母
代码注意事项:
字母和数组元素的对应关系尽量采用减法关系,相对%方式节省资源
代码实现
bool isAnagram(char * s, char * t){
if((s == NULL) || (t == NULL))
{
return false;
}
char smap[26] = {0};
memset(smap,0,26);
while((*s) && (*t)) //防止s和t长度不一样
{
if((*s > 64) && (*s < 91))
smap[*s - 65]++;
else if((*s > 96) && (*s < 123))
smap[(*s) - 97]++;
s++;
if((*t > 64) && (*t < 91))
smap[*t - 65 ]--;
else if((*t > 96) && (*t < 123))
smap[(*t) - 97]--;
t++;
}
if(*s != *t)
{
return false;
}
for(int i = 0; i < 26; i++)
{
if(0 != smap[i])
{
return false;
}
}
return true;
}