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
仅包含小写字母
思路:
本题是判断两个字符串中的所含的元素是否相同,遇到这类匹配相关的问题,很容易就能够想到运用哈希表来进行求解。又由于是仅仅包含小写字母,所以可以采用数组形式的字符串,定义大小为26就足够了,用于存储每个元素出现的次数。
而另一种方法就是通过将两个字符串分别进行排序,这是一种相对暴力地解法,若所含元素相同,个数也相同,那么在排序过后,两个字符串应该是一模一样的。
哈希表:
class Solution {
public:
bool isAnagram(string s, string t) {
int arr[26] = { 0 };
for (int i = 0; i < s.size(); i++) //遍历字符串s,给哈希表赋值
{
arr[s[i] - 'a']++; //字符以ASCII码形式传入
}
for (int i = 0; i < t.size(); i++) //遍历字符串t,调整哈希表中值
{
arr[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++)
{
if (arr[i] != 0) //判断哈希表是否全为0
{
return false;
}
}
return true;
}
};
值得一提的是,这里的字符是以ASCII码的形式传入的,通过减去'a',我们可以让a字符对应数组中的0位置,b字符对应1,以此类推。
排序:
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size()) {
return false; //首先判断长度是否相同
}
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
首先可以判断长度是否相同,若是长度不同,那必定不符合题意。接着就进行排序,进而比较。
往期回顾:
LeetCode977.有序数组的平方
LeetCode844.比较含退格的字符串
LeetCode283.移动零
LeetCode27.移除元素
LeetCode26.删除有序数组中的重复项
LeetCode209.长度最小的子数组
LeetCode904. 水果成篮