【算法系列-哈希表】有效的字母异位词
欢迎来到【算法系列】第三弹 🏆 哈希表,接下来我们将围绕哈希表这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨
文章目录
1. 有效的字母异位词(LeetCode 242)
【题目链接】 有效的字母异位词 LeetCode 242
1.1 思路分析🎯
1.2 解题过程🎬
1.3 代码示例🌰
class Solution {
public boolean isAnagram(String s, String t) {
int[] arr = new int[26];
for (int i = 0;i < s.length();i++) {
arr[s.charAt(i) - 'a']++;
}
for (int i = 0;i < t.length();i++) {
arr[t.charAt(i) - 'a']--;
}
for (int i = 0;i < arr.length;i++) {
if (arr[i] != 0) {
return false;
}
}
return true;
}
}
掌握了解题思路后,提供以下几道类型相似的题用来练习
2. 赎金信(LeetCode 383)
【题目链接】 赎金信 LeetCode 383
2.1 思路分析🎯
2.2 代码示例🌰
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] arr = new int[26];
for (int i = 0;i < ransomNote.length();i++) {
arr[ransomNote.charAt(i) - 'a']++;
}
for (int i = 0;i < magazine.length();i++) {
arr[magazine.charAt(i) - 'a']--;
}
for (int i = 0;i < arr.length;i++) {
if (arr[i] > 0) {
return false;
}
}
return true;
}
}
3. 字母异位分词(LeetCode 49)
【题目链接】字母异位分词 LeetCode 49
3.1 思路分析🎯
3.2 解题过程🎬
3.3 代码示例🌰
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<String> list = new ArrayList<>();
for (int i = 0;i < strs.length;i++) {
list.add(strs[i]);
}
List<List<String>> ret = new ArrayList<>();
while (!list.isEmpty()) {
List<String> retArr = new ArrayList<>();
String str1 = list.get(0);
retArr.add(str1);
for (int i = 1;i < list.size();i++) {
String str2 = list.get(i);
if (str1.length() == str2.length() && judge(str1, str2)) {
retArr.add(list.get(i));
}
}
for (int j = 0;j < retArr.size();j++) {
list.remove(retArr.get(j));
}
ret.add(retArr);
}
return ret;
}
public boolean judge(String s1, String s2) {
int[] arr = new int[26];
for (int i = 0;i < s1.length();i++) {
arr[s1.charAt(i) - 'a']++;
}
for (int i = 0;i < s2.length();i++) {
arr[s2.charAt(i) - 'a']--;
}
for (int i = 0;i < arr.length;i++) {
if (arr[i] != 0) {
return false;
}
}
return true;
}
}
4. 找到字符串中所有的字母异位词(LeetCode 438)
【题目链接】找到字符串中所有的字母异位词 LeetCode 438
4.1 思路分析🎯
4.2 解题过程🎬
4.3 代码示例🌰
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> ret = new ArrayList<>();
int sLen = s.length();
int pLen = p.length();
if (sLen < pLen) { // 当 s 的长度小于 p的长度时,直接返回空数组即可
return new ArrayList<>();
}
int[] sArr = new int[26]; // sArr 用来记录 s 字符串中每个字母的词频
int[] pArr = new int[26]; // tArr 用来记录 t 字符串中每个字母的词频
for (int i = 0;i < pLen;i++) {
sArr[s.charAt(i) - 'a']++; // 这里记录s字符串前 plen个(t字符串的长度) 长度的字符的词频
pArr[p.charAt(i) - 'a']++; // 这里记录t字符串所有字符的词频,记录一次即可,后面作为判断标准
}
// 这里相当于第一次进行滑动窗口的判断,窗口第一次进入数组
if (Arrays.equals(sArr, pArr)) {
ret.add(0);
}
// 到这里滑动窗口已经进行过一轮判断了
for (int i = 0;i < sLen - pLen;i++) {
sArr[s.charAt(i) - 'a']--; // 窗口起始位置向后移动
sArr[s.charAt(i + pLen) - 'a']++; // 窗口终止位置向后移动
// 判断移动后的窗口集合是否与t字符串构成异位词
if (Arrays.equals(sArr, pArr)) {
ret.add(i + 1); // 之所以是 i + 1 而非 i 是因为在进入循环前已经对第一次窗口判断进行赋值了
}
}
return ret;
}
}
以上便是对有效的字母异位词类型题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨