【力扣-哈希表】1、有效的字母异位词(242)

131 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

242. 有效的字母异位词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意: 若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

暴力法

使用两个容器来存储字符串,对两个容器进行排序,判断两个容器相同位置的字符是否相同 常用排序算法【c++常用排序算法】

class Solution
{
public:
    bool isAnagram(string s, string t)
    {
        // 两个字符串的长度不相同的时候,返回false
        if (s.size() != t.size())
        {
            return false;
        }

        // 使用两个容器来存储字符
        vector<char> s_v;
        vector<char> t_v;

        for (int i = 0; i < s.size(); i++)
        {
            s_v.push_back(s[i]);
            t_v.push_back(t[i]);
        }
        // 对两个容器中的字符进行排序
        sort(s_v.begin(), s_v.end());
        sort(t_v.begin(), t_v.end());

        // 排序后,两容器相同位置的字符不同则返回false
        for (int i = 0; i < s.size(); i++)
        {
            if (s_v[i] != t_v[i])
            {
                return false;
            }
        }
        return true;
    };
};

image.png

哈希法

使用数组来记录出现的字符,本题只考虑小写字母,所以使用可以设置数组的大小为26,对应[a-z]的下标,初始数组元素值全 0 ,之后同时遍历字符串s和字符串t , 将s中出现的字符根据相对索引 c - 'a' 找到下标位置,将数组内容加1,对t中出现的字符使用相同方法,将下标所在位置的数组内容减1 , 遍历完后,判断数组中是否存在不为0的元素 , 存在则说明两个字符串不是有效的字母异位词。

class Solution
{
public:
    bool isAnagram(string s, string t)
    {
        if (s.size() != t.size())
        {
            return false;
        }

        // 字符数组存储26个英文字母,初始化为0
        char ch[26] = {0};

        // 假设 字母 a 的存储索引为 0
        // 则其他字母的存储索引为  c - 'a'
        for (int i = 0; i < s.size(); i++)
        {
            ch[s[i] - 'a'] += 1;
            ch[t[i] - 'a'] -= 1;
        }

        for (int i = 0; i < 26; i++)
        {
            if (ch[i] != 0)
            {
                return false;
            }
        }
        return true;
    }
};

image.png