title: 每日一練(44):有效的字母異位詞
categories:[劍指offer]
tags:[每日一練]
date: 2022/04/18
每日一練(44):有效的字母異位詞
給定兩個字串 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 僅包含小寫字母
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
方法一:排序
思路分析
t 是 s 的異位詞等價於「兩個字串排序後相等」。因此我們可以對字串 s 和 t 分別排序,看排序後的字串是否相等即可判斷。此外,如果 s 和 t 的長度
不同,t 必然不是 s 的異位詞。
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
方法二:雜湊表
思路分析
由於字串只包含 26 個小寫字母,因此我們可以維護一個長度為 26 的頻次陣列 table,先遍歷記錄字串 s 中字元出現的頻次,然後遍歷字元
串 t,減去 table 中對應的頻次,如果出現 table[i]<0,則說明 tt 包含一個不在 s 中的額外字元,返回 false 即可
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
vector<int> table(26, 0);
for (auto &ch : s) {
table[ch - 'a']++;
}
for (auto &ch : t) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}