题目链接:242. 有效的字母异位词
题目:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
提示:
- 1 <= s.length, t.length <= 5 * 104
- s 和 t 仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思路和算法:
题目中有说到
t
t
t 如果是
s
s
s 的异位词,则返回
t
r
u
e
true
true ,否则返回
f
a
l
s
e
false
false 。对于不是异位词的情况有三种:(1)字符串
s
s
s 的长度大于字符串
t
t
t ;(2)字符串
s
s
s 中的字符没有出现在字符串
t
t
t 中;(3)字符串
s
s
s 中的字符种类没有全部出现在字符串
t
t
t 中。
【上面证明的是
t
t
t 如果是
s
s
s 的异位词,这里如果要证明
s
s
s 和
t
t
t 互为异位词,则(1)中字符串
s
s
s 和字符串
t
t
t 的长度必须相等,即判断条件改为 if(s.length() != t.length()) {return false;};
;(2)中字符串
s
s
s 和字符串
t
t
t 的字符种类一样和出现次数也一样。】
首先用一个哈希表
h
a
s
h
hash
hash 插入字符串
s
s
s 中的所有元素,其中
h
a
s
h
hash
hash 表的
k
e
y
key
key 值为字符串
s
s
s 中的字符,
v
a
l
u
e
value
value 值为字符出现的次数。然后依次遍历字符串
t
t
t 中的字符,通过
h
a
s
h
hash
hash 的
c
o
u
n
t
count
count 方法来判断字符是否存在,如果存在,则
k
e
y
key
key 值对应得
v
a
l
u
e
value
value 值减一。此时如果
v
a
l
u
e
value
value 值为负数,则代表
t
t
t 中该字符出现次数少于
s
s
s 中的,返回
f
a
l
s
e
false
false ;如果用
c
o
u
n
t
count
count 方法判断不存在,则直接返回
f
a
l
s
e
false
false 。
代码(C++):
//哈希表
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() > t.length()) return false; //字符串s的长度大于字符串t,则t一定不是s的异位词
unordered_map<char, int> hash; //存放字符串s中的字符和出现次数
for (char ch : s) {
if (hash.count(ch))
hash[ch] += 1; //如果字符在hash表中已经存在,则其对应的value值加1
else
hash[ch] = 1; //不存在则插入元素
}
for (char ch : t) {
if (hash.count(ch)) {
hash[ch] -= 1; //如果t中的字符在hash表中存在,则存在次数value值减1
if (hash[ch] < 0)
return false; //表示字符串t中ch字符出现次数少于字符串s中的
}
else
return false; //字符ch没有出现在字符串s中
}
return true;
}
};