题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。

当遇到这道题目时,在学习到哈希法之前呢,很多coder都第一时间会想到运用两层嵌套for循环去暴力检索两个字符串,同时还要记录字符出现的次数。这样显然不是有效的方法。因此本次将运用到哈希法。
👍解题思路:由于数据较小,因此创建一个数组来充当哈希表。数组其实就是一个简单哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。而且本次题目涉及到的数据都是小写的英文字母,因此使用数组充当哈希表即可。
1.创建一个长度为26的数组。(英文字母一共有26个),以下数组长度已省略。

public boolean isAnagram(String s, String t) {
int[] record=new int[26]; //定义一个长度为26的数组。
}
2.运用for循环把s字符串的元素与字母'a'进行相减,因为在ASCII码表中,26个英文字母都是按照顺序进行排列的,它们相减的值也是有序的,可以存储进入record数组中来记录字符出现的次数。
public boolean isAnagram(String s, String t) {
int[] record=new int[26];
for (int i = 0; i <=s.length(); i++) {
record[s.charAt(i)-'a']++; //记录字符出现的次数
}
}
3.运用for循环把t字符串的元素与字母'a'进行相减,不过相反的是,t字符串与'a'相减的结果对应record数组的索引的值需要-1,因为最后判断这两个字符串是否为有效的字母异位词的凭据是该record数组中的元素是否都为0。若为0,则是有效的字母异位词,相反,则不是。
public boolean isAnagram(String s, String t) {
int[] record=new int[26]; //定义一个长度为26的数组。
for (int i = 0; i <=s.length(); i++) {
record[s.charAt(i)-'a']++; //记录字符出现的次数
}
for (int i = 0; i <=t.length(); i++) {
record[t.charAt(i)-'a']--;
}
}
4.判断record数组中的元素是否为0。
public boolean isAnagram(String s, String t) {
int[] record=new int[26]; //定义一个长度为26的数组。
for (int i = 0; i <=s.length(); i++) {
record[s.charAt(i)-'a']++; //记录字符出现的次数
}
for (int i = 0; i <=t.length(); i++) {
record[t.charAt(i)-'a']--;
}
for (int element : record) { //遍历record数组的元素
if (element!=0){
return false;
}
}
return true;
}
8万+

被折叠的 条评论
为什么被折叠?



