241-有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
核心思路:用哈希表或数组来记录每个字符出现的次数,并一一进行比较。
方法一:数组
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
int num[128];//ASCALL码共128个
for(int i=0;i<128;++i)
{
num[i]=0;
}
for(int i=0;i<s.size();++i)
{
num[s[i]]++;
num[t[i]]--;
}
for(int i=0;i<128;++i)
{
if(num[i]!=0)
{
return false;
}
}
return true;
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
方法二:哈希表
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
unordered_map<char,int> m;
for(int i=0;i<s.size();++i)
{
m[s[i]]++;
}
for(int i=0;i<s.size();++i)
{
if(m[t[i]]>0)
{
m[t[i]]--;
}
else
return false;
}
return true;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
49-字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
方法一:排序
由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> mp;
for (string& str: strs) {
string key = str;
sort(key.begin(), key.end());
mp[key].emplace_back(str);
}
vector<vector<string>> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);//哈希表可以用second
}
return ans;
}
};
- 时间复杂度:O(nklogk),其中n是strs中的字符串的数量,k是strs中的字符串的最大长度。需要遍历 n 个字符串,对于每个字符串,需要 O(klogk) 的时间进行排序以及 O(1) 的时间更新哈希表,因此总时间复杂度是O(nklogk)。
- 空间复杂度:O(nk),主要为哈希表所占用的空间。