Day81: 有效的字母异位词

23 阅读2分钟

给定两个字符串 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  
}