给定两个字符串 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 的整型数组 hash1
来记录每个字母在第一个字符串中出现的次数。首先,遍历第一个字符串 s
,将每个字符转化为对应的数组下标,并将对应计数器加一。然后,遍历第二个字符串 t
,将每个字符转化为对应的数组下标,并将对应计数器减一。最后,再次遍历整个数组,如果有任何计数器不为零,则表示两个字符串不是字母异位词,返回 false;否则,返回 true,表示两个字符串是字母异位词。
代码中的输出部分是为了方便查看数组中每个计数器的值,可以通过输出结果来调试和验证程序的正确性。
int hash1[26] = {0}; // 创建一个长度为26的整型数组,用于计数每个字母出现的次数
if (s.length() != t.length()) { // 如果两个字符串的长度不相等,直接返回 false
return false;
}
for (int i = 0; i < s.length(); ++i) { // 遍历第一个字符串的每个字符
hash1[s.at(i) - 'a']++; // 将对应字符的计数器加一,通过字符的 ASCII 码减去 'a' 得到数组下标
}
for (int i = 0; i < 26; ++i) { // 输出数组中的计数器值以便查看
cout << hash1[i];
}
cout << endl; // 输出换行符以便区分
for (int j = 0; j < t.length(); ++j) { // 遍历第二个字符串的每个字符
hash1[t.at(j) - 'a']--; // 将对应字符的计数器减一
}
for (int i = 0; i < 26; ++i) { // 再次遍历数组,如果有任何计数器不为零,则表示两个字符串不是字母异位词,返回 false
if (hash1[i] != 0) {
return false;
}
}
return true; // 如果数组中所有计数器都为零,则表示两个字符串是字母异位词,返回 true
}