LeetCode刷题-有效的字母异位词
2021-07-16 本文已影响0人
小鲨鱼FF
前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给定两个字符串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 * 10^4
s 和 t 仅包含小写字母
进阶:
如果输入字符串包含unicode字符怎么办?你能否调整你的解法来应对这种情况?
分析过程
第一步
若字符串s和字符串t的长度不同,肯定不是互为字母异位词,直接返回false。
第二步
遍历字符串s,用集合map来保存字符串s的各种字符的数量。
第三步
遍历字符串t,若集合map找不到字符,那么字符串s和字符串t不互为字母异位词,直接返回false。
若集合map找到字符,那么集合map的字符数量减1。若此时字符的数量小于0,那么字符串s和字符串t中的此字符数量不相等,所以字符串s和字符串t肯定不互为字母异位词,直接返回false。
第四步
遍历字符串t结束后,遍历集合map,判断每一个key的value值是否都大于0,只要出现一个value值大于0,那么字符串s和字符串t就不互为字母异位词,直接返回false。
第五步
若能遍历完集合map,那么字符串s和字符串t互为字母异位词,返回true。因为这时集合map中的字符数量全部都是0,证明字符串s和字符串t中每个字符出现的次数都相同,刚好符合互为字母异位词。
解答代码
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
// 若字符串s和字符串t的长度不同,肯定不是字母异位词,返回false
return false;
}
// 思路:用集合map保存字符串s的字符的数量,遍历字符串t时集合map中的字符数量减1,若有集合map中不存在的字符,不是字母异位词,遍历完字符串t,若集合map中的字符数量全部变为0,那么就是字母异位词,否则不是字母异位词
// 定义集合map,保存字符串s各个字符的数量
Map<Character, Integer> map = new HashMap<>();
// 遍历字符串s的字符
for (int i = 0; i < s.length(); ++i) {
char c = s.charAt(i);
// 保存字符的数量到集合map中,若集合map中不存在此字符的key,数量保存为1
map.put(c, map.getOrDefault(c, 0) + 1);
}
// 遍历字符串t的字符
for (int i = 0; i < t.length(); ++i) {
char c = t.charAt(i);
if (map.containsKey(c)) {
// 若集合map中存在key,数量减1
map.put(c, map.get(c) - 1);
if (map.get(c) < 0) {
// 若集合map中的key的数量小于0,那么字符串s和字符串t中的此字符数量不相等,不是字母异位词,返回false
return false;
}
} else {
// 若集合map中不存在key,那么不是字母异位词,返回false
return false;
}
}
// 遍历集合map
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
if (entry.getValue() > 0) {
// 只要有一个key的数量大于0,那么字符串s和字符串t中就存在数量不相等字符,返回false
return false;
}
}
// 遍历结束,证明字符串s和字符串t中的所有字符的数量相等,返回true
return true;
}
}
提交结果
执行用时16ms,时间击败23.59%的用户,内存消耗39MB,空间击败20.85%的用户。
运行结果原文链接
原文链接:有效的字母异位词