首页 > 其他分享 >LeetCode题练习与总结:找到字符串中所有字母异位词--438

LeetCode题练习与总结:找到字符串中所有字母异位词--438

时间:2024-12-01 21:59:15浏览次数:7  
标签:count 数组 -- 异位 len 索引 438 字符串 LeetCode

一、题目描述

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 10^4
  • s 和 p 仅包含小写字母

二、解题思路

  1. 首先定义两个数组,分别记录字符串 s 和 p 中每个字符出现的次数。由于字符串只包含小写字母,所以可以使用长度为 26 的数组。

  2. 遍历字符串 p,统计每个字符出现的次数,并记录在数组 p_count 中。

  3. 使用一个滑动窗口来遍历字符串 s,窗口大小为 p 的长度。在滑动窗口中,统计窗口内每个字符出现的次数,并记录在数组 s_count 中。

  4. 每次滑动窗口移动时,比较 s_count 和 p_count 是否相等。如果相等,说明找到了一个异位词,记录当前窗口的起始索引。

  5. 继续移动滑动窗口,每次移动时,更新 s_count 数组,直到遍历完字符串 s。

  6. 返回所有异位词的起始索引。

三、具体代码

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> result = new ArrayList<>();
        if (s == null || s.length() == 0 || p == null || p.length() == 0) {
            return result;
        }

        int[] s_count = new int[26];
        int[] p_count = new int[26];
        int s_len = s.length(), p_len = p.length();

        // 统计 p 中每个字符出现的次数
        for (char c : p.toCharArray()) {
            p_count[c - 'a']++;
        }

        // 使用滑动窗口遍历 s
        for (int i = 0; i < s_len; i++) {
            // 将当前字符加入 s_count
            s_count[s.charAt(i) - 'a']++;

            // 移除窗口最左边的字符
            if (i >= p_len) {
                s_count[s.charAt(i - p_len) - 'a']--;
            }

            // 如果 s_count 和 p_count 相等,说明找到了一个异位词
            if (i >= p_len - 1 && compareArrays(s_count, p_count)) {
                result.add(i - p_len + 1);
            }
        }

        return result;
    }

    // 比较 two arrays 是否相等
    private boolean compareArrays(int[] arr1, int[] arr2) {
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 统计字符串 p 中每个字符出现的次数,需要遍历整个字符串 p,这是一个 O(p_len) 的操作,其中 p_len 是字符串 p 的长度。

  • 使用滑动窗口遍历字符串 s,这个操作需要遍历整个字符串 s,这是一个 O(s_len) 的操作,其中 s_len 是字符串 s 的长度。

  • 在每次滑动窗口移动时,都会调用 compareArrays 方法来比较两个数组。由于这两个数组长度固定为 26,所以这个操作的时间复杂度是 O(1)。

因此,总的时间复杂度是 O(p_len) + O(s_len) * O(1) = O(p_len + s_len)。

2. 空间复杂度
  • 使用了两个长度为 26 的数组 s_count 和 p_count 来分别记录字符串 s 和 p 中每个字符出现的次数,所以这部分的空间复杂度是 O(1),因为这两个数组的长度是常数。

  • 使用了一个列表 result 来存储结果,在最坏的情况下,如果字符串 s 中每个长度为 p_len 的子串都是字符串 p 的异位词,那么这个列表的长度将是 O(s_len)。因此,这部分的空间复杂度是 O(s_len)。

综上所述,总的空间复杂度是 O(1) + O(s_len) = O(s_len)。

五、总结知识点

  1. 类定义:定义了一个名为 Solution 的类,这是 Java 中定义类的基本方式。

  2. 方法定义:在 Solution 类中定义了一个公共方法 findAnagrams,它接受两个字符串参数 s 和 p,并返回一个整数列表。

  3. 条件判断:在方法开始处,使用 if 语句检查输入字符串是否为空或长度为零,这是防御性编程的一种形式,用于避免空指针异常。

  4. 数组的声明和使用:声明了两个长度为 26 的整型数组 s_count 和 p_count,用于存储每个字符出现的次数。由于只考虑小写字母,所以数组的大小为 26,对应英文字母表中的字母数量。

  5. 字符与整数的转换:通过 char - 'a' 将字符转换为对应的整数索引,这是处理字符计数问题的常用技巧。

  6. 循环结构:使用了 for 循环来遍历字符串 p 和 s,以及数组 s_count 和 p_count

  7. 列表的使用:使用了 ArrayList 来存储和返回结果,这是一种动态数组,用于存储找到的异位词的起始索引。

  8. 方法调用:在主方法 findAnagrams 中调用了辅助方法 compareArrays 来比较两个数组是否相等。

  9. 逻辑运算:在滑动窗口的逻辑中,使用了逻辑与运算符 && 来确保只有在窗口大小等于 p 的长度时才比较两个数组。

  10. 辅助方法:定义了一个私有辅助方法 compareArrays,用于比较两个整型数组是否相等,这是代码模块化和复用的体现。

  11. 数组索引操作:在滑动窗口中,通过数组索引操作来更新和检查字符计数。

  12. 列表添加操作:使用 add 方法将找到的异位词起始索引添加到结果列表中。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:count,数组,--,异位,len,索引,438,字符串,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/144160825

相关文章

  • SQL面试题——日期交叉问题 合并日期重叠的活动
    日期交叉问题—合并日期重叠的活动今天的需求背景和前面我们的一个面试题目的背景一样,只不过是具体的需求变了,可以先看一下我们之前的文章SQL面试题——日期交叉问题计算活动的总天数+------+----------+----------+|id|stt|ett|+------+----------+......
  • 独家原创 | 基于TCN-SENet +BiGRU-GlobalAttention并行预测模型
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客拒绝信息泄露!VMD滚动分解+Informer-BiLSTM并行预测模型-CSDN博客风速预测(一)数据集介绍和预处理_风......
  • 基于改进1D-VGG模型的轴承故障诊断和t-SNE可视化
    往期精彩内容:Python-凯斯西储大学(CWRU)轴承数据解读与分类处理Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客三十多个开源数据集|故障诊断再也不用担心数据集了!Py......
  • [Python学习笔记4]——函数
    目录 1.函数的定义2.传递实参2.1位置实参2.2关键字实参2.3给形参指定默认值3.返回值3.1返回简单值3.2将形参的默认值指定为空字符串以实现实参可选3.3返回字典或列表4.传递列表4.1向函数传递列表4.2在函数中修改列表4.3禁止函数修改列表(使用列表切......
  • 万能门店小程序 onepic_uploade 任意文件上传漏洞复现
    0x01产品描述: ‌     万能门店小程序‌是一个为多行业商家提供一站式解决方案的小程序平台,支持多行业使用,具备强大的线上线下融合能力。它通过后台一键切换版本和一键扫码上传功能,简化了小程序的开发和审核流程,无需登录开发者工具即可提交审核‌。0x02漏洞描述: ......
  • CO模块-专题方案-OKK4-MM模块采购信息记录价格都维护的是含税价格,CO模块CK11N或CK40N
    业务说明:实战项目上,CO模块会使用事务码CK11N或CN40N跑标准成本估算。SAP系统默认采购价格为不含税净价,但是国内项目大部分维护的采购价格都是含税的。那么财务CO模块跑出来的标准成本估算会不会基于采购信息记录含税价格进行估算了(这里有一点需要明确:CO模块针对于BOM中的外购件......
  • Abp Vnext Vue Element UI实现
    AbpVnextVueElementUI实现版本开箱即用的中后台前端/设计解决方案链接AbpProVben5VueElementPlus预览点击查看效果文档地址点击查看文档国内文档地址点击查看文档实现功能用户管理角色管理审计日志后台任务集成事件多语言Free......
  • 2024-2025-1 20231309《计算机基础与程序设计》第九周助教总结
    课程答疑现阶段,大家都主要在学习C语言编程,时不时会遇到程序不会写,报错不会改的问题。而出现此类问题的主要原因包括:算法不熟悉,如写不出素数的判断等解决方案:多熟悉学习常见的简单算法包括比大小,判断素数等语法不熟悉,如赋值和判断语句等解决方案:多熟悉课本和PPT相关内......
  • Android 简单控件
    创建一个新模块chapter03:创建成功:在模块chapter03中创建一个布局:布局文件的内容:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_pare......
  • 基于Bootstrap的Material Design风格表单插件
    JqueryMaterialFormPlugin是一款基于Bootstrap的MaterialDesign风格的JQUERY表单插件。该表单通过自定义样式和jQuery来将Bootstrap的表单修改为扁平风格的表单,并带有浮动标签特效。在线演示  下载  使用方法使用该MaterialDesign风格表单需要在页面中引入jquery,bo......