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