题目描述
原题链接:242. 有效的字母异位词
一、ASCII码作为Key
因s和t都为小写字母,因此可将s和t中字母用ASCII码数字表示,减去a
,映射到0-25当中,作为Hash表映射结构。
首先,查看s和t的长度是否相同,若不同,则一定不为字母异位词。
然后,遍历s中字母,将键对应的值加一。再去遍历t中字母,减去已记录的Hash表中的键值,当出现减去后小于0时,说明t相对于s在该位多一位字,那么相应的也会相对于s在某一位上少一位字,t和s不为字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()) return false;
int record[26] = {0};
for(int i = 0; i < s.size(); i++) {
record[s[i] - 'a']++;
}
for(int i = 0; i < t.size(); i++) {
if(--record[t[i] - 'a'] < 0) return false;
}
return true;
}
};
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
1
)
O(1)
O(1)(为一个常量空间)
二、字符作为Key
采用unordered_map
让String
作为Key,在字符串s中每出现一个Key,就将对应的Value加一。
然后遍历字符串t,当用t中字符作为Key,找到对应的Value为0时,说明不为字符异位词,返回false
。当不为0时,说明对应的字符串s中出现过该字符,将其对应的Value减一。当全部遍历完未出现0时,说明互为字母异位词,返回true
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()) return false;
unordered_map<char, int> record;
for(char str : s) {
record[str]++;
}
for(char str : t) {
if(record[str] != 0) {
record[str]--;
} else {
return false;
}
}
return true;
}
};
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
n
)
O(n)
O(n)