这个题应该算是很简单的,也可以不用unordered_map这种,这种键值比较少的可以直接用数组。
/**
* 解题思路:使用unordered_map,键值为字母,实值为出现的次数,用变量sum保存map中现有总数量,首先将s
* 的字母放进哈希表中,同时更新sum,然后依次判断t中字符是否在map中,若不在,直接返回false,若在,则使
* 对应实值减1,若减为0,从哈希表中删去,同时sum减1.
*/
class Solution {
public:
bool isAnagram(string s, string t) {
unordered_map<char, int> sChar;
int sum = 0;
for (auto i : s) {
if (sChar.find(i) != sChar.end())
sChar[i]++;
else
sChar.insert(pair<char, int>(i, 1));
sum++;
}
for (auto i : t) {
if (sChar.find(i) == sChar.end())
return false;
sChar[i]--;
sum--;
if (sChar[i] == 0)
sChar.erase(i);
}
if (sum == 0)
return true;
return false;
}
};
这个题还是用哈希表来做,想到了就简单,用排序后的字符串作为键值,本来的字符串作为实值,就这样。
/**
* 解题思路:依次将数组中元素放入哈希表中,键值为排序后得到的字符串,实值为一个数组,
* 然后将map中的数据放入结果中。
*/
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> resultMap;
for (auto &str : strs) {
string temp = str;
sort(temp.begin(), temp.end());
resultMap[temp].push_back(str);
}
vector<vector<string>> ans;
for (auto i = resultMap.begin(); i != resultMap.end(); i++){
ans.push_back(i->second);
}
return ans;
}
};
这个题怎么说呢,还是想到了就不难,而且这个用unordered_map还要麻烦一点,直接用数组当哈希表比较简单。
/**
* 解题思路:使用数组作为一种哈希表,序号代表字母,实值代表字母出现的次数,然后利用一个和p长度大小
* 相同的滑动窗口,每次滑动一格,然后统计字母个数,若统计后该数组与统计p的字母个数数组相同,说明窗口
* 对应的字符串符合条件,存储相应序号
*/
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int lenS = s.length(), lenP = p.length();
if (lenS < lenP)
return vector<int>();
vector<int> arrayS(26, 0);
vector<int> arrayP(26, 0);
for (int i = 0; i < lenP; i++) {
arrayP[p[i] - 'a']++;
arrayS[s[i] - 'a']++;
}
int left = 0, right = lenP;
vector<int> ans;
if (arrayP == arrayS)
ans.push_back(left);
while (right < lenS) {
arrayS[s[left++] - 'a']--;
arrayS[s[right++] - 'a']++;
if (arrayS == arrayP)
ans.push_back(left);
}
return ans;
}
};
总的来说,字母异位词一般都用哈希表来做,而且如果可以的话,直接用数组做就行。