1. 程式人生 > 其它 >每日一練(44):有效的字母異位詞

每日一練(44):有效的字母異位詞


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/problems/valid-anagram

方法一:排序

思路分析

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;
}