宛宛类卿还是更胜一筹,leetcode 242与383联动讲解

题目

Problem: 242. 有效的字母异位词

给定两个字符串 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 仅包含小写字母
Problem: 383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:

输入:ransomNote = "aa", magazine = "aab"
输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNote 和 magazine 由小写英文字母组成

 


242思路

判断两个字符串,其中一个是否是另一个的打乱重拼版

那我们需要获取s,t中的字母,进行比对即可

最终结果得让每个字母都有归宿

不能多不能少

242解题过程

英文一共就26个字母,我们选用数组record作为数据结构即可

遍历字符串s

将字母转化为ASCII码(s[i]-'a')作为record的索引下标,这是它目前的暂存小窝

相同字母住一块,record元素就代表他们的个数

统计完s,我们就要将这些字母拿到t中使用

遍历t,相应字母从小窝离开

再来检查record

看看有没有遗漏的(>0),或者明明已经没了非要拿走的(<0)

出现以上情况则不符合题意,返回false

都对上了则返回true

242Code


class Solution {

public:

    bool isAnagram(string s, string t) {

        int record[26]={0};//每个字母一个记录空间

        for(int i =0 ;i<s.length();i++){

            record[s[i]-'a']++;

        }

        for(int i = 0;i<t.length();i++){

            record[t[i]-'a']--;

        }

        for(int i=0;i<26;i++){

            if(record[i]!=0){

                return false;

            }

        }

        return true;

    }

};

 


383思路

如果有做过242. 有效的字母异位词的朋友 看到383这题肯定觉得尤为相似 又是一位故人啊~ 那么这题与242的区别在哪呢??? 383究竟是甄嬛还是纯元皇后呢???

题目情境是这样的: 你是一个穷凶极恶的绑匪 捆了一位少爷想要向他的富豪爸爸讨要赎金 但又不想自己写信暴露字迹 于是你找来了一张报纸magazine 想要从magazine上抠出你需要的字母拼成赎金信ransomnote 现在的任务就是知道magazine上有什么字母即其个数 再来对比ransomnote所需要的 如果不够那就false pass掉这张报纸

242是需要整体全部过一遍才能确定true or false 但383只要发现一个不够了就可以骂骂咧咧地丢掉这张报纸,返回false 嗯呢没错383才是偷懒圣体 我们需要想办法偷工减料地完成这项任务

所以啊,是242宛宛类卿了~

 

383解题过程

选取数组作为统计字母的数据结构,字母一共就26个选择其它的不合适

那么我们就需要开始统计magazine 在此之前,可以先看两眼magazine和ransomNote的长度 如果ransomNote显然比较大,那直接false,根本不用数了啊!

如果没有偷懒成功(ransomNote小于magazine) 遍历magazine字符串 将字母转为对应ASCII码作为record数组的索引,对应元素作为出现次数

再看ransomNote,一个一个查看,并在record中减去 这里就不需要像242一样,遍历完所有再从头查看record数组的记录情况 当你发现一个字母不够用那就可以pass掉这份报纸了(return false)

开玩笑,日理万机的绑匪难道很爱看报纸吗

非要看完全部的才发现:啊!我少了一个“a”

所以为了高效生成ransomNote

我们在遍历ransomNote,对record做修改的同时

判断该字母是否有缺即可

整一个流程下来

终于可以拿着赎金信去抢钱啦!

(现实中我们都是遵纪守法好公民,绝不做违法乱纪的事情!!!)

383Code

class Solution {

public:

    bool canConstruct(string ransomNote, string magazine) {

        //仿242. 有效的字母异位词写法

        int record[26]={0};

        //先排除一些低级情况,省的做无用功

        if(magazine.length()<ransomNote.length()){

            return false;

        }

        //给magazine中每个字母出现次数做记录

        for(int i=0;i<magazine.length();i++){

            record[magazine[i]-'a']++;

        }

        for(int i=0;i<ransomNote.length();i++){

            record[ransomNote[i]-'a']--;

            if(record[ransomNote[i]-'a']<0){

                return false;

            }

        }

        //不用整体检查,改用边减边查,可以提高效率

        // for(int i=0;i<26;i++){

        //     if(record[i]<0){

        //         return false;

        //     }

        // }

        

        return true;

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值