题目描述:
给定两个字符串 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;