小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
242. 有效的字母异位词
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意: 若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
暴力法
使用两个容器来存储字符串,对两个容器进行排序,判断两个容器相同位置的字符是否相同 常用排序算法:【c++常用排序算法】
class Solution
{
public:
bool isAnagram(string s, string t)
{
// 两个字符串的长度不相同的时候,返回false
if (s.size() != t.size())
{
return false;
}
// 使用两个容器来存储字符
vector<char> s_v;
vector<char> t_v;
for (int i = 0; i < s.size(); i++)
{
s_v.push_back(s[i]);
t_v.push_back(t[i]);
}
// 对两个容器中的字符进行排序
sort(s_v.begin(), s_v.end());
sort(t_v.begin(), t_v.end());
// 排序后,两容器相同位置的字符不同则返回false
for (int i = 0; i < s.size(); i++)
{
if (s_v[i] != t_v[i])
{
return false;
}
}
return true;
};
};
哈希法
使用数组来记录出现的字符,本题只考虑小写字母,所以使用可以设置数组的大小为26,对应[a-z]的下标,初始数组元素值全 0 ,之后同时遍历字符串s和字符串t , 将s中出现的字符根据相对索引 c - 'a' 找到下标位置,将数组内容加1,对t中出现的字符使用相同方法,将下标所在位置的数组内容减1 , 遍历完后,判断数组中是否存在不为0的元素 , 存在则说明两个字符串不是有效的字母异位词。
class Solution
{
public:
bool isAnagram(string s, string t)
{
if (s.size() != t.size())
{
return false;
}
// 字符数组存储26个英文字母,初始化为0
char ch[26] = {0};
// 假设 字母 a 的存储索引为 0
// 则其他字母的存储索引为 c - 'a'
for (int i = 0; i < s.size(); i++)
{
ch[s[i] - 'a'] += 1;
ch[t[i] - 'a'] -= 1;
}
for (int i = 0; i < 26; i++)
{
if (ch[i] != 0)
{
return false;
}
}
return true;
}
};