学习+刷题:242. 有效的字母异位词

题目描述:

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

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

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:

string是标准模板库里的函数,它自带排序的函数sort,即将字符串内的字母按ascii值进行比较,然后按照升序输出。

所以可以直接判断排序以后的字符串s 和t 是否相等即可

复习两个函数,sort  和lenght

if(s.length()!=t.length())
{
return false;
}
else
{
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}

方法二:

使用哈希表,哈希表我是第一次接触,其实一开始不太明白,看了b站一个视频,感觉讲解的比较基础,对小白理解起来很友好

看动画,5分钟学会最经典的数据结构哈希表,C语言手写实现,不要错过呀_哔哩哔哩_bilibili

因为题目假设字符串只包含小写字母,a~z的ascii值对应97~122

所以定义一个长度26的整型数组,初始值都为0    vector<int>table(26,0);

我们遍历字符串s 的所有字母,并让每个字母ch与'a' 相减,对应的table[ch-'a']++

那么得到的table[]值就是0-25;

例如字符串“hello”

遍历时从h到o; 没遍历一个字母table值都+1;

第一次:table['h'-'a']++            (因为初始table[]都等于0,这时++,代表table[7]=1; 因为'h'=104)

第二次:table['e'-'a']++              (代表table[4]=1; 因为'e'=101)

第三次:table['l'-'a']++              (代表table[11]=1; 因为'l'=108)

第三次:table['l'-'a']++              (代表table[11]=2; 因为'l'=108)

第三次:table['o'-'a']++              (代表table[14]=1; 因为'l'=111)

至此字符串s 的哈希表就做好了;

接着我们再去遍历字符串t, 但这时候不再是table[]++,因为table[]已经有的有值了,所以我们让table[]--,如果table[]--  以后小于0,说明在字符串t 里面出现了s 里面有的字母,或者说某个字母在t 里出现的次数比在s 里面出现的次数多,这时候返回false

否则遍历完以后返回true

class Solution {
public:
    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;
    }
};

 两个for循环官方给的都是简洁形式的,我习惯写我们常见的那种比较长的。。。

if(s.length()!=t.length())
{
return false;
}

vector<int>table(26,0);
for(int i=0;i<s.length();i++)
{
table[s[i]-'a']++;
}
for(int i=0;i<t.length();i++)
{
table[t[i]-'a']--;
if(table[t[i]-'a']<0)
return false;
}
return true;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值