LeetCode 438. 找到字符串中所有字母異位詞 | 滑動窗口與字符計數數組解法

文章目錄

    • 問題描述
    • 核心思路:滑動窗口 + 字符計數數組
      • 1. 字符計數數組
      • 2. 滑動窗口
    • 算法步驟
    • 完整代碼實現
    • 復雜度分析
    • 關鍵點總結
    • 類似問題

問題描述

給定兩個字符串 sp,要求找到 s 中所有是 p 的**字母異位詞(Anagram)**的子串的起始索引。
字母異位詞是指由相同字母重新排列形成的字符串(包含相同的字母且每個字母出現的次數相同)。
例如:

  • 輸入:s = "cbaebabacd", p = "abc"
    輸出:[0, 6]
    解釋:s 中從索引 0 開始的 "cba" 和索引 6 開始的 "bac" 均為 "abc" 的異位詞。

核心思路:滑動窗口 + 字符計數數組

1. 字符計數數組

  • 核心思想:通過固定長度的數組(長度26,對應26個小寫字母)記錄字符串中每個字符的出現次數。
  • 比較機制:若兩個字符串的字符計數數組相同,則它們是字母異位詞。

2. 滑動窗口

  • 窗口初始化:在 s 中初始化一個長度為 p.length() 的窗口。
  • 窗口滑動:每次向右移動窗口,移除左邊界字符的計數,增加右邊界字符的計數。
  • 實時比較:每次滑動后檢查當前窗口的計數數組是否與 p 的計數數組一致。

算法步驟

  1. 邊界處理:若 s 的長度小于 pp 為空,直接返回空列表。
  2. 初始化計數數組
    • pCount:統計 p 中每個字符的出現次數。
    • sCount:統計 s 中初始窗口(前 p.length() 個字符)的出現次數。
  3. 初始窗口檢查:若初始窗口的計數與 p 一致,記錄索引 0
  4. 滑動窗口遍歷
    • 窗口每次右移一位,更新左邊界字符的計數(減少)和右邊界字符的計數(增加)。
    • 每次更新后檢查計數數組是否匹配,若匹配則記錄當前窗口的起始索引。

完整代碼實現

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> result = new ArrayList<>();int m = p.length();int n = s.length();// 邊界條件處理if (m == 0 || n < m) {return result;}int[] pCount = new int[26]; // 記錄p的字符計數int[] sCount = new int[26]; // 記錄當前窗口的字符計數// 初始化p和s的初始窗口的字符計數for (int i = 0; i < m; i++) {pCount[p.charAt(i) - 'a']++;sCount[s.charAt(i) - 'a']++;}// 檢查初始窗口是否匹配if (Arrays.equals(pCount, sCount)) {result.add(0);}// 滑動窗口:每次移動一位,更新sCount并檢查for (int i = 1; i <= n - m; i++) {// 移除左邊界字符的計數int leftChar = s.charAt(i - 1);sCount[leftChar - 'a']--;// 添加右邊界字符的計數int rightChar = s.charAt(i + m - 1);sCount[rightChar - 'a']++;// 檢查當前窗口是否匹配if (Arrays.equals(pCount, sCount)) {result.add(i);}}return result;}
}

復雜度分析

  • 時間復雜度O(n),其中 n 是字符串 s 的長度。
    滑動窗口遍歷 s 需要 O(n),每次窗口操作(更新計數和比較)的時間為常數。
  • 空間復雜度O(1),使用固定長度的兩個長度為26的數組。

關鍵點總結

  1. 字符計數數組:利用數組索引映射字符,快速統計字符出現次數。
  2. 滑動窗口優化:避免每次重新計算整個子串的計數,通過動態更新窗口邊界字符的計數保證高效性。
  3. 邊界處理:注意字符串長度不足時的直接返回邏輯。

類似問題

  • LeetCode 567. 字符串的排列:判斷 s2 是否包含 s1 的排列。
  • LeetCode 76. 最小覆蓋子串:尋找覆蓋目標字符的最短子串。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81836.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea中,git的cherry-pick怎么用

背景: A同學在A分支進行開發, B同學在B分支進行開發,B同學開發過程中發現,A同學在A分支上面的某次提交,例如某次提交了一個工具類,B同學也用的到這個工具類,但是B又不想mergeA分支的代碼,此時就可以用到git的chery pick能力.

深入解析:如何基于開源OpENer開發EtherNet/IP從站服務

一、EtherNet/IP協議概述 EtherNet/IP(Industrial Protocol)是一種基于以太網的工業自動化通信協議,它將CIP(Common Industrial Protocol)封裝在標準以太網幀中,通過TCP/IP和UDP/IP實現工業設備間的通信。作為ODVA(Open DeviceNet Vendors Association)組織的核心協議…

當 PyIceberg 和 DuckDB 遇見 AWS S3 Tables:打造 Serverless 數據湖“開源夢幻組合”

引言 在一些大數據分析場景比如電商大數據營銷中&#xff0c;我們需要快速分析存儲海量用戶行為數據&#xff08;如瀏覽、加購、下單&#xff09;&#xff0c;以進行用戶行為分析&#xff0c;優化營銷策略。傳統方法依賴 Spark/Presto 集群或 Redshift 查詢 S3 上的 Parquet/O…

流復備機斷檔處理

文章目錄 環境癥狀問題原因解決方案 環境 系統平臺&#xff1a;UOS&#xff08;海光&#xff09;,UOS &#xff08;飛騰&#xff09;,UOS&#xff08;鯤鵬&#xff09;,UOS&#xff08;龍芯&#xff09;,UOS &#xff08;申威&#xff09;,銀河麒麟svs&#xff08;X86_64&…

【藍橋杯真題精講】第 16 屆 Python A 組(省賽)

文章目錄 T1 偏藍 (5/5)T2 IPv6 (0/5)T3 2025 圖形 (10/10)T4 最大數字 (10/10)T5 倒水 (15/15)T6 拼好數 (0/15)T7 登山 (20/20)T8 原料采購 (20/20) 更好的閱讀體驗 高速訪問&#xff1a;https://wiki.dwj601.cn/ds-and-algo/lan-qiao-cup/16th-python-a/永久鏈接&#xff1…

SpringBoot+Dubbo+Zookeeper實現分布式系統步驟

SpringBootDubboZookeeper實現分布式系統 一、分布式系統通俗解釋二、環境準備&#xff08;詳細版&#xff09;1. 軟件版本2. 安裝Zookeeper&#xff08;單機模式&#xff09; 三、完整項目結構&#xff08;帶詳細注釋&#xff09;四、手把手代碼實現步驟1&#xff1a;創建父工…

Spring的業務層,持久層,控制層的關系

在 Spring 框架中&#xff0c;控制層&#xff08;Controller&#xff09;、業務層&#xff08;Service&#xff09; 和 持久層&#xff08;Repository/Mapper&#xff09; 是分層架構的核心組成部分&#xff0c;職責分離明確&#xff0c;通過依賴注入&#xff08;DI&#xff09…

css實現不確定內容的高度過渡

實現效果&#xff1a;鼠標懸浮按鈕&#xff0c;高度過渡出現如圖所示文本框 代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

計算機視覺與深度學習 | matlab實現ARIMA-WOA-CNN-LSTM時間序列預測(完整源碼和數據)

以下是一個基于MATLAB的ARIMA-WOA-CNN-LSTM時間序列預測框架。由于完整代碼較長,此處提供核心模塊和實現思路,完整源碼和數據可通過文末方式獲取。 1. 數據準備(示例數據) 使用MATLAB內置的航空乘客數據集: % 加載數據 data = readtable(airline-passengers.csv); data …

在 Excel 中使用東方仙盟軟件————仙盟創夢IDE

安裝插件 用仙盟創夢編寫插件代碼 源碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 東方仙盟.仙盟創夢IDE_招標系統 {public static class 仙盟創夢_招標專…

Sql刷題日志(day9)

一、筆試 1、limit offset&#xff1a;分頁查詢 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳過前 start_row 行&#xff0c;返回接下來的 number_of_rows 行。 2、lag、lead&#xff1a;查詢前后行數據 --lag函數用于訪問當…

C++面試3——const關鍵字的核心概念、典型場景和易錯陷阱

const關鍵字的核心概念、典型場景和易錯陷阱 一、const本質&#xff1a;類型系統的守護者 1. 與#define的本質差異 維度#defineconst編譯階段預處理替換編譯器類型檢查作用域無作用域&#xff08;全局污染&#xff09;遵循塊作用域調試可見性符號消失保留符號信息類型安全無類…

16-看門狗和RTC

一、獨立看門狗 1、獨立看門狗概述 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff08;不按照正常程序進行運行&#xff0c;如程序重啟&#xff0c;但是如果我們填加看門狗的技術&#xff0…

w~自動駕駛~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法來啦&#xff01; 在自動駕駛系統當中&#xff0c;感知任務是整個自駕系統中至關重要的組成部分。感知任務的主要目標是使自動駕駛車輛能夠理解和感知周圍的環境元素&…

怎么打包發布到npm?——從零到一的詳細指南

怎么打包發布到npm&#xff1f;——從零到一的詳細指南 目錄 怎么打包發布到npm&#xff1f;——從零到一的詳細指南一、準備工作1. 注冊 npm 賬號2. 安裝 Node.js 和 npm 二、初始化項目三、編寫你的代碼四、配置 package.json五、打包你的項目六、登錄 npm七、發布到 npm八、…

【C++ - 仿mudou庫one thread one loop式高并發服務器實現】

文章目錄 項目介紹項目模塊和服務器主要設計模式項目主要流程前置知識1.bind函數2.定時器任務TimerTask和時間輪思想TimerWheel3.正則表達式4.通用型容器Any類 服務器設計模式1&#xff09;單Reactor單線程模式2&#xff09;單Reactor多線程模式3&#xff09;多Reactor多線程模…

RISC-V 開發板 MUSE Pi Pro USB 測試(3.0 U盤,2.0 UVC攝像頭)

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro USB 測試&#xff08;3.0 U盤&#xff0c;2.0 UVC攝像頭&#xff09; 總共開發板有4個USB的A口&#xff0c;1個USB的TypeC口&#xff0c;我們插上兩個USB3.0的U盤和一個USB2.0的UVC攝像頭來進行測試 lsusb -tv 可以看到有3個US…

docker學習與使用(概念、鏡像、容器、數據卷、dockerfile等)

文章目錄 前言引入docker 簡介docker的應用場景docker的虛擬化技術VS虛擬機docker的優點docker架構Docker倉庫Docker鏡像linux操作系統的大致組成部分 Docker容器 docker安裝與啟動校驗版本移除舊的版本安裝依賴工具設置軟件源安裝docker驗證 配置鏡像加速器docker服務相關命令…

記錄一次服務器卡頓

一、服務器卡頓現象 服務用了一段時間后&#xff0c;突然很卡&#xff0c;發現在服務器上新建excel也很卡&#xff0c;發現服務器中病毒了&#xff0c;然后重新安裝了操作系統。重新安裝服務環境時&#xff0c;發現同時安裝pdf、tomcat時都很慢&#xff0c;只能一個安裝好了&am…

基于 Reactor 的 Java 高性能異步編程:響應式流與背壓詳解

本文將圍繞 Reactor 框架&#xff0c;深入剖析響應式流的核心機制&#xff0c;重點講解背壓&#xff08;Backpressure&#xff09;的實現原理與實際應用。通過理論結合實踐&#xff0c;希望幫助你真正掌握 Java 世界的響應式異步編程。 一、響應式編程與 Reactor 簡介 1.1 什么…