Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
原文链接: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 * 10^4s和t仅包含小写字母
什么是字母异位词? 字符串长度相同,字符个数相同,位置可能不同!
二、思路分析
做这道题目,我们需要先了解一下Hash表,最简单的就是一个数组[2,1,5,3,4],让数组的值模除长度得到的结果当作索引存储到数组中,此数组可以算是一个hash表
2 % 5 = 2(索引为2); 1 % 5 = 1(索引为1); ... [5,1,2,3,4]
当然可能会遇到hash冲突
[2,5,7,3,4] 2 % 5 = 2; 7 % 5 = 2; 索引都是2,怎么办?
两种方法:拉链法 + 线性探测法
线性探测法:遇到冲突后,往后面挪一位,如果还有冲突继续挪,挪到没有冲突!(也可以每次挪两位,重要是思想)
拉链法:在冲突的节点后面添加链表来存储冲突数据!
注意:hash表的作用就是可以通过hash求值的方式快速查找元素!
那说这么多,跟这道题目有半毛钱关系吗?
当然有,我们可以利用它思想,首先我们可以建一个int[] record = new int[26]的数据来存储数据!把然后把字符串拆成字符数组,然后让字符数组-a,当作索引,遍历s的时候,将对应索引的值+1,遍历t的时候-1,如果record有不是0的,则不是字母异位词!
三、AC代码
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for (char c : s.toCharArray()){
record[c - 'a'] += 1;
}
for (char c : t.toCharArray()){
record[c - 'a'] -= 1;
}
for (int i : record){
if (i != 0) return false;
}
return true;
}
}
感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤