有效字母异位词力扣--242

目录

题目

思路

代码


题目

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

示例 1:

复制代码
输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

复制代码
输入: s = "rat", t = "car"
输出: false

思路

1.什么是异位词?

两个字符串中除了字母的顺序不一样以外,组成字符串的字母都一样。

2.怎么想到要使用哈希表?

相当于查找一个字母是否在集合中,自然想到哈希表。

3.暴力解法可否解出来?

用两个for循环,可以暴力解出来,时间复杂度是O(n^2)

4.用哈希表的思路

  • 关键是构造哈希函数,想到用一个数组存每个字母出现的次数,将出现的字母种类称作a,哈希表的长度称作b a不能大于b,特殊之处在于,是字母,且两个字符串都是小写的,a-z的ASCII码差为26,所以创建一个长度为26的就可以。
  • 先遍历一个字符串S,通过某种方式,找到存他的位置,出现一次位置上就+1,通过这种方法来得到他出现几次
  • 通过的方式:长度为26,所以数组必然是从0-25,只需要用得到的字母的ASCII码减去a的,就可以得到唯一确定的存储位置。
  • 接着遍历另一个字符串T,通过同样的方式找到唯一存储的位置索引,然后-1
  • 最后只需要遍历哈希表,如果所有元素都为0,那么返回true,否则不行(如果大于0,说明某个字母在S中出现比在T中多出现一次,如果小于0说明某个字母在T中比在S中多出现一次)

代码

java 复制代码
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] c=new int[26];//创建长度为26的哈希表,让每个字母出现的次数都有唯一且确定的位置存放
        for(int i=0;i<s.length();i++){//遍历其中一个字符串
            c[s.charAt(i)-'a']++;//找到存放的位置,出现次数+1
        }
        for(int j=0;j<t.length();j++){//遍历另一个元素
            c[t.charAt(j)-'a']--;

        }
        for(int result:c){//遍历哈希表
            if(result!=0){
                return false;//不是
            }
           
        }  
         return true;//是
    } 
}
java 复制代码
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length())//长度不一样,必然不是
            return false;
        int[] alpha = new int[26];
        for(int i = 0; i< s.length(); i++) {//有了上述判断只需要遍历一个字符串就可以了
            alpha[s.charAt(i) - 'a'] ++;
            alpha[t.charAt(i) - 'a'] --;
        }
        for(int i=0;i<26;i++)
            if(alpha[i] != 0)
                return false;
        return true;
    }
}
相关推荐
前端Hardy7 小时前
面试官:JS数组的常用方法有哪些?这篇总结让你面试稳了!
javascript·面试
yuki_uix8 小时前
Props、Context、EventBus、状态管理:组件通信方案选择指南
前端·javascript·react.js
日月云棠8 小时前
各版本JDK对比:JDK 25 特性详解
java
全栈老石8 小时前
手写无限画布4 —— 从视觉图元到元数据对象
前端·javascript·canvas
用户8307196840829 小时前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide9 小时前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
Leon10 小时前
新手引导 intro.js 的使用
前端·javascript·vue.js
IT探险家10 小时前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺10 小时前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户9083246027310 小时前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端