给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思路1:
我想到的方法是 遍历两个字符串的字母 存放在计数数组中 正好可以用到之前的 data[s.at(i)] 返回一个s串中对应i位置元素的引用,运行不通过,不知道为啥
思路2:类似我的思路 它使用 s[i]-'a’来表示 计数数组中的对应位置 很好用 应该记住 但为什么我是用两个分别记录 然后看是否相等 却不通过?
class Solution {
public:
bool isAnagram(string s, string t) {
//思路: 1.首先判断长度是否相等
// 2.长度相等的情况下 如果在s串出现字母的种类与次数和t串中出现的情况一样 就是异位单词
// 使用两个大小为26的数组来记录每个字符串
// 中字母的情况 分别遍历两个字符串
if(s.length()!=t.length())
return false;
int a[26];
int b[26];
for(int i=0;i<s.length();++i){
a[s[i]-'a']++;
}
for(int j=0;j<t.length();++j){
b[t[j]-'a']++;
}
for(int k=0;k<=26;++k){
if(a[k]!=b[k])
return false;
}
return true;
}
};
根据题解修改后的代码:
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length()!=t.length())
return false;
int a[26]={0};
for(int i=0;i<s.length();++i){
a[s[i]-'a']++;
a[t[i]-'a']--;
}
for(int j=0;j<26;++j){
if(a[j]!=0)
return false;
}
return true;
}
};
思路3:最直接解法方法 代码简单好懂
分别排序 然后比较
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length()!=t.length())
return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
if(s==t)
return true;
return false;
}
};