劍指Offer|LCR 015. 找到字符串中所有字母異位詞

LCR 015. 找到字符串中所有字母異位詞

給定兩個字符串 sp,找到 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 * 104
  • sp 僅包含小寫字母

法1:滑動窗口

分析:

看例子s = "abab", p = "ab"

如果p的長度 大于 s的長度,說明s中不存在字母異位詞,則返回空列表

定義pCount,將p中每個字母的出現次數存一下,pCount[0]表示字母a在p中出現次數;

先對比索引0處,是不是字母異位詞。

遍歷s前面和p一樣長度的字符,將這部分s中字母頻數記錄到windowCount,此時,如果pCountwindowCount各個元素值相同,則下標0是字母異位詞,就將0加到結果中。

接著再遍歷s在p.length后的字符串,

索引每忘右移一下,就將當前元素的頻數加到windowCount中,也需減去當前索引-p.length下標元素頻數去掉,這樣保持每次計算的頻數長度與p的長度想用,每次都比較pCountwindowCount各個元素值相同,相同則將i - p.length + 1加入結果。

時間復雜度 O ( n ) O(n) O(n)

空間復雜度 O ( n ) O(n) O(n)

var findAnagrams = function(s, p) {if (s.length < p.length) return [];let result = [];let pCount = new Array(26).fill(0); // 用來記錄 p 中每個字符的頻率let windowCount = new Array(26).fill(0); // 用來記錄當前窗口中每個字符的頻率// 將 p 中每個字符的頻率記錄到 pCount 數組中for (let i = 0; i < p.length; i++) {pCount[p.charCodeAt(i) - 'a'.charCodeAt(0)]++;}// 初始化滑動窗口的第一個窗口for (let i = 0; i < p.length; i++) {windowCount[s.charCodeAt(i) - 'a'.charCodeAt(0)]++;}// 如果第一個窗口是變位詞,加入結果if (arraysAreEqual(pCount, windowCount)) {result.push(0);}// 滑動窗口遍歷字符串 sfor (let i = p.length; i < s.length; i++) {// 新加入的字符windowCount[s.charCodeAt(i) - 'a'.charCodeAt(0)]++;// 移除左邊的字符windowCount[s.charCodeAt(i - p.length) - 'a'.charCodeAt(0)]--;// 檢查當前窗口是否為變位詞if (arraysAreEqual(pCount, windowCount)) {result.push(i - p.length + 1);}}return result;
};// 輔助函數:檢查兩個頻率數組是否相等
function arraysAreEqual(arr1, arr2) {for (let i = 0; i < 26; i++) {if (arr1[i] !== arr2[i]) {return false;}}return true;
}

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

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

相關文章

高質量 Next.js 后臺管理模板源碼分享,開發者必備

高質量 Next.js后臺管理模板源碼分享&#xff0c;開發者必備 Taplox 是一個基于 Bootstrap 5 和 Next.js 構建的現代化后臺管理模板和 UI 組件庫。它不僅設計精美&#xff0c;還提供了一整套易用的工具&#xff0c;適合各種 Web 應用、管理系統和儀表盤項目。無論你是初學者還是…

開發場景中Java 集合的最佳選擇

在 Java 開發中&#xff0c;集合類是處理數據的核心工具。合理選擇集合&#xff0c;不僅可以提高代碼效率&#xff0c;還能讓代碼更簡潔。本篇文章將重點探討 List、Set 和 Map 的適用場景及優缺點&#xff0c;幫助你在實際開發中找到最佳解決方案。 一、List&#xff1a;有序存…

Java包裝類型的緩存

Java 基本數據類型的包裝類型的大部分都用到了緩存機制來提升性能。 Byte,Short,Integer,Long 這 4 種包裝類默認創建了數值 [-128&#xff0c;127] 的相應類型的緩存數據&#xff0c;Character 創建了數值在 [0,127] 范圍的緩存數據&#xff0c;Boolean 直接返回 True or Fal…

工程師 - MinGW

MinGW Minimalist GNU for Windows&#xff0c;前身為mingw32&#xff0c;是一個免費開源的軟件開發環境&#xff0c;從2010年開始項目停止并不再使用。后續提供MinGW-w64。 MinGW包括: - 移植到Windows上的GNU編譯器集&#xff08;GCC&#xff09;&#xff0c;包括C、C、ADA和…

EasyExcel(讀取操作和填充操作)

文章目錄 1.準備Read.xlsx&#xff08;具有兩個sheet&#xff09;2.讀取第一個sheet中的數據1.模板2.方法3.結果 3.讀取所有sheet中的數據1.模板2.方法3.結果 EasyExcel填充1.簡單填充1.準備 Fill01.xlsx2.無模版3.方法4.結果 2.列表填充1.準備 Fill02.xlsx2.模板3.方法4.結果 …

CKA認證 | Day7 K8s存儲

第七章 Kubernetes存儲 1、數據卷與數據持久卷 為什么需要數據卷&#xff1f; 容器中的文件在磁盤上是臨時存放的&#xff0c;這給容器中運行比較重要的應用程序帶來一些問題。 問題1&#xff1a;當容器升級或者崩潰時&#xff0c;kubelet會重建容器&#xff0c;容器內文件會…

Python調用R語言中的程序包來執行回歸樹、隨機森林、條件推斷樹和條件推斷森林算法

要使用Python調用R語言中的程序包來執行回歸樹、隨機森林、條件推斷樹和條件推斷森林算法&#xff0c;重新計算中國居民收入不平等&#xff0c;并進行分類匯總&#xff0c;我們可以使用rpy2庫。rpy2允許在Python中嵌入R代碼并調用R函數。以下是一個詳細的步驟和示例代碼&#x…

關于JAVA方法值傳遞問題

1.1 前言 之前在學習C語言的時候&#xff0c;將實參傳遞給方法&#xff08;或函數&#xff09;的方式分為兩種&#xff1a;值傳遞和引用傳遞&#xff0c;但在JAVA中只有值傳遞&#xff08;顛覆認知&#xff0c;基礎沒學踏實&#xff09; 參考文章&#xff1a;https://blog.csd…

Excel基礎知識

一&#xff1a;數組 一行或者一列數據稱為一維數組&#xff0c;多行多列稱為二維數組&#xff0c;數組支持算術運算&#xff08;如加減乘除等&#xff09;。 行&#xff1a;{1,2,3,4} 數組中的每個值用逗號分隔列&#xff1a;{1;2;3;4} 數組中的每個值用分號分隔行列&#xf…

基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD Video 之全功能顯示器連接端口方案

隨著USB-C連接器和PD功能的出現&#xff0c;新一代USB-C PD PC顯示器可以用作個人和專業PC工作環境的電源和數據集線器。 雖然USB-C PD顯示器是唯一插入墻壁插座的交流電源輸入設備&#xff0c;但它可以作為數據UFP&#xff08;上游接口&#xff09;連接到連接到TCD&#xff0…

gazebo_world 基本圍墻。

如何使用&#xff1f; 參考gazebo harmonic的官方教程。 本人使用harmonic的template&#xff0c;在里面進行修改就可以分流暢地使用下去。 以下是world 文件. <?xml version"1.0" ?> <!--Try sending commands:gz topic -t "/model/diff_drive/…

解決無法在 Ubuntu 24.04 上運行 AppImage 應用

在 Ubuntu 24.04 中運行 AppImage 應用的完整指南 在 Ubuntu 24.04 中&#xff0c;許多用戶可能會遇到 AppImage 應用無法啟動的問題。即使你已經設置了正確的文件權限&#xff0c;AppImage 仍然拒絕運行。這通常是由于缺少必要的庫文件所致。 問題根源&#xff1a;缺少 FUSE…

Pytorch使用手冊-DCGAN 指南(專題十四)

1. Introduction 本教程將通過一個示例介紹 DCGANs(深度卷積生成對抗網絡)。我們將訓練一個生成對抗網絡(GAN),在給它展示大量真實名人照片后,它能夠生成新的“名人”圖片。這里的大部分代碼來源于 PyTorch 官方示例中的 DCGAN 實現,而本文檔將對該實現進行詳細解釋,并…

springboot配置oracle+達夢數據庫多數據源配置并動態切換

項目場景&#xff1a; 在工作中很多情況需要跨數據庫進行數據操作,自己總結的經驗希望對各位有所幫助 問題描述 總結了幾個問題 1.識別不到mapper 2.識別不到xml 3.找不到數據源 原因分析&#xff1a; 1.配置文件編寫導致識別mapper 2.配置類編寫建的格式有問題 3.命名…

html+css+js網頁設計 美食 家美食1個頁面

htmlcssjs網頁設計 美食 家美食1個頁面 網頁作品代碼簡單&#xff0c;可使用任意HTML輯軟件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html編輯軟件進行運行及修改編輯等操作&#xff09;。 獲取源碼 1&#xf…

【機器學習】【樸素貝葉斯分類器】從理論到實踐:樸素貝葉斯分類器在垃圾短信過濾中的應用

&#x1f31f; 關于我 &#x1f31f; 大家好呀&#xff01;&#x1f44b; 我是一名大三在讀學生&#xff0c;目前對人工智能領域充滿了濃厚的興趣&#xff0c;尤其是機器學習、深度學習和自然語言處理這些酷炫的技術&#xff01;&#x1f916;&#x1f4bb; 平時我喜歡動手做實…

Vue使用Tinymce 編輯器

目錄 一、下載并重新組織tinymce結構二、使用三、遇到的坑 一、下載并重新組織tinymce結構 下載 npm install tinymce^7 or yarn add tinymce^7重構目錄 在node_moudles里找到tinymce文件夾&#xff0c;把里面文件拷貝一份放到public下&#xff0c;如下&#xff1a; -- pub…

odoo中@api.model, @api.depends和@api.onchange 裝飾器的區別

文章目錄 1. api.model用途特點示例 2. api.depends用途特點示例 3. api.onchange用途特點示例 總結 在 Odoo 中&#xff0c;裝飾器&#xff08;decorators&#xff09;用于修飾方法&#xff0c;以指定它們的行為和觸發條件。api.model、api.depends 和 api.onchange 是三個常用…

EMNLP'24 最佳論文解讀 | 大語言模型的預訓練數據檢測:基于散度的校準方法

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入&#xff01; 點擊 閱讀原文 觀看作者講解回放&#xff01; 作者簡介 張偉超&#xff0c;中國科學院計算所網絡數據科學與技術重點實驗室三年級直博生 內容簡介 近年來&#xff0c;大語言模型&#xff08;LLMs&#xff09;的…

大數據技術-Hadoop(一)Hadoop集群的安裝與配置

目錄 一、準備工作 1、安裝jdk&#xff08;每個節點都執行&#xff09; 2、修改主機配置 &#xff08;每個節點都執行&#xff09; 3、配置ssh無密登錄 &#xff08;每個節點都執行&#xff09; 二、安裝Hadoop&#xff08;每個節點都執行&#xff09; 三、集群啟動配置&a…