题源: 242. 有效的字母异位词
这段代码定义了一个函数isAnagram
,用于检查两个输入字符串s
和t
是否为字母异位词。字母异位词是指两个字符串的字母相同,但排列不同的词。现在,我们将逐步分析这段代码,并提供一个详细的题解。
方法:字符计数
解题思路是检查两个字符串中每个字符出现的次数是否相等。这里使用一个数组 record
作为计数器来跟踪每个字母在两个字符串中出现的次数差。
解题步骤
-
初始化计数器:定义一个长度为26的整数数组
record
,用来记录每个字母在字符串s
中出现次数与在字符串t
中出现次数的差值。初始化所有元素为0。 -
计算字符串
s
的字母频率:遍历字符串s
,每遇到一个字符,就将该字符对应的record
数组的计数器增加1。这是通过record[s[i] - 'a']++
实现的,其中s[i] - 'a'
计算字符s[i]
相对于'a'
的位置。 -
根据字符串
t
调整字母频率:再遍历字符串t
,每遇到一个字符,就将该字符对应的record
数组的计数器减少1。这通过record[t[i] - 'a']--
实现。 -
检查计数器数组:最后,遍历
record
数组,检查每个字母的最终计数器值。如果所有计数器的值都是0,那么两个字符串s
和t
就是字母异位词;如果任何一个计数器的值不为0,那么两个字符串不是字母异位词。
代码分析
这个函数使用了一个简单的计数器数组来有效地比较两个字符串的字符,避免了排序和其他复杂的字符串操作,因此非常高效。
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串
s
和字符串t
中较长的长度。这是因为我们需要遍历两个字符串各一次来计算字符频率。 - 空间复杂度:O(1),因为
record
数组的大小是常数(只有26个可能的字符)。
示例
举个例子,如果 s = "anagram"
和 t = "nagaram"
,那么 isAnagram
函数会返回 true
,因为字符串 t
可以通过重新排列字符变成字符串 s
。
Code
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i = 0;i < s.size();i ++)
record[s[i] - 'a'] ++;
for(int i = 0;i < t.size();i ++)
record[t[i] - 'a'] --;
for(int i = 0;i < 26;i ++)
if(record[i] != 0) return false;
return true;
}
};