题目
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
输入: s = "anagram", t = "nagaram"
输出: true
代码
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>
using namespace std;
class Solution {//哈希表 O(N)O(N)
public:
bool isAnagram(string s, string t) {
// 哈希表检查字母是否都出现过,且个数一致
unordered_map<char, int> umap1;
unordered_map<char, int> umap2;
for (int i = 0; i < s.size(); i++) {
umap1[s[i]]++;
}
for (int j = 0; j < t.size(); j++) {
umap2[t[j]]++;
}
if (umap1 == umap2) return true;
return false;
}
};
class Solution1 {//哈希表 O(N)O(S)
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
vector<int> table(26, 0);
for (auto& ch : s) {
table[ch - 'a']++;
}
for (auto& ch : t) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}
};
class Solution3 {//排序 O(nlogn) O(logn)
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
vector<int> split(string params_str) {
vector<int> p;
while (params_str.find(" ") != string::npos) {
int found = params_str.find(" ");
p.push_back(stoi(params_str.substr(0, found)));
params_str = params_str.substr(found + 1);
}
p.push_back(stoi(params_str));
return p;
}
int main() {
string arr1;
string arr2;
getline(cin, arr1);
getline(cin, arr2);
Solution1 method;
bool result;
result = method.isAnagram(arr1, arr2);
cout << boolalpha << result;
}