一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
哈希表索引
思路:题目的意思就是, 出来字母的顺序不一样其它的一样, 那么map就成为了我们的好伙伴。字母的种类和出现的次数一致即可
具体实现步骤如下: - 首先很容易想到将两个进行遍历,然后一一对应 - 而哈希表数组,是将字符映射到数组上面,而这里正好都是小写,属于ASCII表26个字母,而a对应索引0 - 因此,for循环,进行每遍历到一个就对数组记录+1; - 在i一个for循环进行-1;如果正好record数组此时为0,代表两个字符串的字符个数完全一样 - 将record进行遍历,看看i是否为0
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;
}
}
桶子法
代码超简单。思路也容易理解
第一次遍历s,使用桶来记录出s中字母的个数。
第二次遍历t,如果存在t中某个字母的频次比s中少的情况,则会出现桶中数字小于0的情况,直接返回false
class Solution {
public boolean isAnagram(String s, String t) {
int[] b = new int[26];
for(int i = 0; i < s.length(); i++) b[s.charAt(i) - 'a']++;
for(int i = 0; i < t.length(); i++) if(--b[t.charAt(i) - 'a'] < 0) return false;
return s.length() == t.length();
}
}
注意
看题使用最简单的方法解决问题。就是将字符串转换为字符串数组,然后对字符串数组进行排序,在进行两个数组的比较,如果两个数组的字符相等,说明两个字符数组相等,直接返回即可,否则不满足条件!!!!还有一种ascll码计算法、思路如下:
我们可以char相加 看 s t的ASCII码值相不相等。但是,比如说,101和3的和却和102和2的和一样,我们这简单的相加还是错。所以,再来个相乘。和相等,乘积也要相等 小写字母ASCII码值都是97,98.。。。122 不会有0