题目描述:
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
解题方法——哈希表法:
代码里的思路写的很详细了,这里不赘述.
//思路: 由于是26个小写字母,因此可以利用hash数组和其ASCII值解题.
// 先对s字符串处理,将其中的的每一个字符的ASCII值对应的数组元素进行+1处理
// 之后根据t字符串的元素,对hash数组中与元素ASCII值对应的元素进行-1处理
// 若最终得到的hash数组的每一位元素均为0,则true,否则为false
bool isAnagram(char* s, char* t) {
//首先定义一个hash数组用来记录字符串出现的次数
int hash[26];
//先遍历s字符串
for(int i=0; i<strlen(s) ;i++ )
{
hash[s[i]-'a']++;
}
//再遍历t字符串
for(int j=0; j<strlen(t); j++)
{
hash[t[j]-'a']--;
}
//最后检查hash数组每一个元素是否都为0
for(int i=0;i<26;i++)
{
if(hash[i]!=0)
return false;
}
return true;
}
优化代码:
bool isAnagram(char* s, char* t) {
//首先定义一个hash数组用来记录字符串出现的次数
int hash[26];
//先遍历s字符串
while(*s) //遍历字符串s,直到遇到空白字符
{
int i=0;
hash[*s++-'a']++;
}
//再遍历t字符串
while(*t)
{
int j=0;
hash[*t++-'a']--;
}
//最后检查hash数组每一个元素是否都为0
for(int i=0;i<26;i++)
{
if(hash[i]!=0)
return false;
}
return true;
}
笔记:①while(*s)可以用于遍历字符串s,但别忘记使用*s++
②也可以通过s和t分别构建两个数组进行记录,之后使用memcmp函数对这两个数组进行比较
注意:memcmp
是一个标准库函数,用于比较内存区域。它定义在 <string.h>
头文件中。memcmp
函数比较由前两个参数指定的内存区域的前 n
个字节(第三个参数指定),并根据比较结果返回整数。memcmp
函数的原型如下:
int memcmp(const void *s1, const void *s2, size_t n);
s1
和s2
是指向要比较的内存区域的指针。n
是要比较的字节数。
返回值:
- 如果
s1
和s2
的前n
个字节完全相同,则返回0
。 - 如果在前
n
个字节中,s1
小于s2
(根据无符号字符的二进制表示进行比较),则返回一个小于0
的值。 - 如果在前
n
个字节中,s1
大于s2
,则返回一个大于0
的值。
注意,memcmp
并不是逐字符比较字符串(即不考虑字符串的终止符 '\0'
),而是根据提供的字节数来比较内存区域。因此,它也可以用于比较非字符串的数据,如结构体或数组的一部分。