题目:
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的 字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
解答:
首先题目中有提示:字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次
第一个思路就是sort排序,然后比较两个字符串是否一致即可,时间复杂度(Nlogn)。
第二个思路就是使用哈希表,需要三次遍历,时间复杂度O(N)。
- 第一次遍历字符串s,统计哈希表中不同下标对应的字母的个数
- 第二次遍历字符串t,消除哈希表中不同下标对应的字母的个数
- 第三次遍历检查哈希表的元素是否全为0,全为0说明s和t是字母异位词,否则不是
class Solution {
public:bool isAnagram(string s, string t) {//sort排序时间复杂度O(nlogn)// sort(s.begin(), s.end());// sort(t.begin(), t.end());// return (s == t) ? true : false;//哈希表时间复杂度O(N)int hashMap[26] = {0};//用哈希表存储对应字母的个数for (int i = 0; i < s.length(); i++){hashMap[s[i] - 'a']++;//记录字符串s的字母个数}for (int i = 0; i < t.length(); i++){hashMap[t[i] - 'a']--;//消除字符串t的字母个数}for (int i = 0; i < 26; i++){//遍历哈希表,如果哈希表所有数值为0,证明是字母异位词,否则不是if (hashMap[i] != 0){return false;}}return true;}
};