LeetCode每日1题--有效的字母异位词

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

解析

image.png

什么是字母异位词?

字符串A=ABDC

字符串B=ABCD

两个字符串中的字符一样次序不一样,它们两个就可以称为字母异位词但像上面这种情况我们就可以说B是A的字母异位词,如果两个字符串相同的话那么我们就说它是互为字母异位词

暴力解法

  1. 如果两个字符串长度不一样,直接返回false
  2. A遍历出自己字符,记录字母出现的次数
  3. B嵌套在A循环里,遍历自己的字符,记录字母出现的次数
  4. 最后比较字母出现的次数是否一样,是否有不一样的字母

聪明的解法(哈希)

这其实可以理解为是一道匹配题对吧,匹配用什么呢?当然是哈希啦!

  1. 初始化一个数组,长度为26,用来记录所有字母可能出现的情况
  2. 遍历A,将字符串记录在数组中,每有一个字母这个位置就+1
  3. 遍历B,每有一个字符从数组中对应位置-1
  4. 如果哈希表的值都为0,则二者就是字母异位词
class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] table = new int[26];
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            table[t.charAt(i) - 'a']--;
            if (table[t.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}

为什么要减去'a'

A的ASCII码是65,字符a到字符z的ACCII是连续的数值,所以字符a - a那么对应的数字就是0,b字符呢?66-65呗,这不就和数组的索引下标对上了吗?哈哈哈真的秒!!!