LeetCode.438找到字符串中所有字母異位詞

問題描述

給定兩個字符串s和p,找到s中所有p的?異位詞?的子串,返回這些子串的起始索引。不考慮答案輸出的順序。

異位詞?指由相同字母重排列形成的字符串(包括相同的字符串)。

解題思路1

注意:該解題思路是錯誤的,正確的是解題思路2

這道題目首先想到的肯定是通過多層循環來遍歷:

  1. 提取子串:遍歷s字符串,提取長度和p相同的子串
  2. 字符匹配:創建p的副本,對于提取的子串中的每個字符,嘗試在p的副本中找到并移除。如果某個字符在p的副本中不存在,說明該子串不是異位詞。
  3. 結果記錄:如果所有字符都成功匹配并且p的副本被完全清空,將當前起始位置添加到結果中。

代碼實現

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> results;int p_len = p.length();int s_len = s.length();if (s_len < p_len)return results;// 遍歷s中的每個可能的起始位置for (int start = 0; start <= s_len - p_len; ++start) {string substr = s.substr(start, p_len); // 獲取當前考慮的子串string temp_p = p; // 創建p的一個副本以供修改// 遍歷當前子串中的每個字符bool matched = true;for (char c : substr) {size_t pos = temp_p.find(c); // 在p的副本中查找當前字符if (pos != string::npos) {temp_p.erase(pos, 1); // 如果找到,從p的副本中移除該字符} else {matched = false; // 如果未找到,標記不匹配并跳出循環break;}}if (matched && temp_p.empty()) { // 檢查是否所有p中的字符都被匹配results.push_back(start);}}return results;}
};

當提交答案時提示“超出時間限制”。

回頭來看這里的問題:

這種方法的時間復雜度較高,因為它涉及到在每個可能的子串中對每個字符進行查找和刪除操作,每次刪除操作可能涉及到字符串的重構,其時間復雜度最壞情況下接近O(n * m^2),其中n是字符串s的長度,m是字符串p的長度。這可能在輸入字符串較長時導致性能問題。

解題思路2

通過對上面思路的反思,我認為這道題嗎不能用多層循環嵌套處理,所以還是從題目本身出發。

我發現最核心的就是如何判斷子串是否為異位詞,上面通過循環遍歷比較來判斷的效率太低,就不能用循環遍歷比較了。

核心思路:因為異位詞不關心字符的順序,只關心字符能不能被匹配上,那就是要判斷字符在子串中出現的次數和出現在p的次數是否相同,如果相同就說明子串屬于異位詞。

解決這一問題的核心思路是利用滑動窗口技術和字符頻率統計:

  1. 字符頻率統計:首先,我們需要一個方式來快速判斷兩個字符串是否為異位詞。最直接的方法是使用一個固定大小為26的數組(假設輸入字符串只包含小寫字母)來統計每個字母在字符串中出現的頻率。

  2. 滑動窗口:這是一種常用于處理數組和字符串的技術。基本思想是維護一個窗口,這個窗口可以增大也可以縮小,隨著窗口的滑動,我們可以在O(1)的時間內更新窗口內的信息。在這個問題中,我們將窗口的大小固定為字符串p的長度,并在s中從左到右滑動這個窗口。

代碼實現

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> result;if (s.size() < p.size())return result;// 創建字符頻率表vector<int> p_count(26, 0), s_count(26, 0);for (char c : p) {p_count[c - 'a']++;}int left = 0, right = 0, p_length = p.size();while (right < s.size()) {// 增加右側字符頻率s_count[s[right] - 'a']++;// 當窗口大小等于p的長度時,比較兩個頻率表if (right - left + 1 == p_length) {if (s_count == p_count) {result.push_back(left);}// 移動窗口,減少左側字符頻率s_count[s[left] - 'a']--;left++;}right++;}return result;}
};

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

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

相關文章

Microsoft VBA Excel 操控 Access資料表和查詢代碼進行搬運操作

問題場景 Run_NoSource_AddressSource_FileDestination_AddressDestination_FileCopy_IndicatorRun_Start_Time1C:\Users\EP\path\to\FileSSS-1.MDBC:\Users\EP\path\to\FileSSC-1.MDBY2C:\Users\EP\path\to\FileSSS-2.MDBC:\Users\EP\path\to\FileSSC-2.MDBY3C:\Users\EP\pat…

NC參照 根據名稱轉換為主鍵值,如部門、人員等參照根據部門名稱、人員名稱獲取對應的主鍵值

NC參照 根據名稱轉換為主鍵值&#xff0c;如部門、人員等參照根據部門名稱、人員名稱獲取對應的主鍵值 private BillCardPanel getEditBillCardPanel() {return getEditor().getBillCardPanel(); }private BillData getEditorBillData() {return this.getEditor().getBillCard…

靜態庫和動態庫

1、編譯過程 1.預處理&#xff1a;解釋并展開源程序當中的所有的預處理指令&#xff0c;此時生成 *.i 文件。 2.編譯&#xff1a;詞法和語法的分析&#xff0c;生成對應硬件平臺的匯編語言文件&#xff0c;此時生成 *.s 文件。 3.匯編&#xff1a;將匯編語言文件翻譯為對應處理…

便攜式煙氣監測儀的應用主要有哪些?

煙氣分析儀是一種用于檢測和分析煙氣中各種成分和污染物含量的儀器&#xff0c;通過采集和處理煙氣樣品&#xff0c;對其中的各種成分進行定量分析。那么&#xff0c;便攜式煙氣監測儀的應用主要有哪些&#xff1f;為方便大家了解&#xff0c;下面就讓小編來為大家簡單介紹一下…

2-2到2-4

計算出所有人的平均年齡&#xff1a; val lines sc.textFile("/root/data/scala/people/page.txt") val count lines.count() val total lines.map(line > line.split(" ")(1)).map(t>t.trim.toInt).collect().reduce((a,b)>ab) val avgAge …

如何防止SQL注入

為了防止SQL注入攻擊&#xff0c;可以采取以下一系列的安全措施&#xff0c;這些措施結合了多篇參考文章中的關鍵信息和方法&#xff1a; 使用參數化查詢或預編譯語句&#xff1a; 這是防止SQL注入的最常見且最有效的方法之一。通過將用戶輸入的數據作為參數傳遞給SQL查詢語句…

[Python]根據文件路徑獲取文件所在目錄、文件名和后綴名

一、簡介 本文介紹了在python中如何根據文件的路徑名字&#xff08;字符串&#xff09;獲取文件所在目錄名、文件名&#xff08;帶后綴&#xff09;、文件名&#xff08;無后綴&#xff09;和文件后綴名。 二、代碼 假設文件路徑為/home/user/temp.txt&#xff0c;使用以下代…

壓縮pdf文件大小的方法,如何壓縮pdf格式的大小

pdf太大怎么壓縮&#xff1f;當你需要通過電子郵件發送一個PDF文件&#xff0c;卻發現文件太大無法成功發出時&#xff0c;這些情況下&#xff0c;我們都需要找到一種方法來壓縮PDF文件&#xff0c;以便更便捷地進行分享和傳輸。PDF文件的大小通常與其中包含的圖片、圖形和文本…

入門JavaWeb之 Response 下載文件

web 服務器接收到客戶端的 http 請求 針對這個請求&#xff0c;分別創建一個代表請求的 HttpServletRequest 對象&#xff0c;代表響應的 HttpServletResponse 對象 獲取客戶端請求過來的參數&#xff1a;HttpServletRequest 給客戶端響應一些信息&#xff1a;HttpServletRe…

數據庫索引失效的11種情況

MySQL中 提高性能 的一個最有效的方式是對數據表 設計合理的索引。索引提供了高效訪問數據的方法&#xff0c;并且加快查詢的速度&#xff0c;因此索引對查詢的速度有著至關重要的影響。使用索引可以 快速地定位 表中的某條記錄&#xff0c;從而提高數據庫査詢的速度&#xff0…

js獲取選中區域(window.getSelection的基本使用)

返回一個 Selection 對象&#xff0c;表示用戶選擇的文本范圍或光標的當前位置。 const selection window.getSelection() 1.toString() //光標選中的文本 const selectedText selection.toString() 2.getRangeAt() //返回一個包含當前選區內容的區域對象。 selection…

數據與文字的表示方法

目錄 1. 數據格式 1. 文本文件格式 2. 二進制文件格式 3. 數據庫格式 4. 壓縮格式 2. 數字機器碼表示 整數表示 浮點數表示 3. 字符與數組的表示方法 1. ASCII&#xff08;美國信息交換標準代碼&#xff09; 2. 擴展ASCII 3. Unicode 4. UTF-8&#xff08;8 位 Uni…

面試相關-接口測試常問的問題

1.為什么要做接口測試 (1)現在大多系統都是前后端分離的項目,前端和后端的進度可能不一樣,那為了盡早的進入測試,前端界面沒有開發完成的情況下,只要后端的接口開發完了,就可以提前做接口測試了; (2)基于安全考慮,只依賴前端進行限制,已經完全不滿足系統的安全性…

Power Pivot——常用DAX 函數

常用DAX 函數 以下這些函數是 DAX 中最常用的一部分&#xff0c;通過熟練掌握這些函數&#xff0c;你可以有效地進行數據分析和建模。 聚合函數 (Aggregation Functions) SUM() 用途&#xff1a;對指定列中的所有數值求和。 語法&#xff1a;SUM() 示例&#xff1a;SUM(Sale…

重生之我要學后端01--后端語言選擇和對應框架選擇

編程語言 后端開發通常需要掌握至少一種編程語言。以下幾種語言在后端開發中非常流行&#xff1a; Java&#xff1a;廣泛用于企業級應用程序。Python&#xff1a;因其易學性和強大的庫支持&#xff08;如Django和Flask&#xff09;而受歡迎。Node.js&#xff08;JavaScript&a…

電商賣家怎么快速采集復制1688全店寶貝到自己店鋪?淘/貓/拼/抖都適用!

1688上面的貨源品類豐富&#xff0c;很多賣家都是在這里找廠家&#xff0c;當我們找好廠家后&#xff0c;怎么將廠家店鋪里所有寶貝都復制到自己店鋪呢&#xff1f; 雖然1688平臺本身支持鋪貨到其他平臺&#xff0c;但一個個鋪貨太耗費時間了。 阿里巴巴中國站獲得1688商品詳…

【AI大模型RAG】深入探索檢索增強生成(RAG)技術

目錄 1. 引言2. RAG技術概述2.1 RAG技術的定義2.2 RAG技術的工作原理2.3 RAG技術的優勢2.4 RAG技術的應用場景 3. RAG的工作流程3.1 輸入處理3.2 索引建立3.3 信息檢索3.4 文檔生成3.5 融合與優化 4. RAG范式的演變4.1 初級 RAG 模型4.2 高級 RAG 模型4.3 模塊化 RAG 模型優化技…

會計報表分析

目錄 一. 會計報表的種類 \quad 一. 會計報表的種類 \quad 反應財務狀況的是資產負債表 反應經營成果的是利潤表 有時間點的就是靜態表 動態表就是有一個區間的, 比如一年, 一個季度等

探索這些有趣的API,讓你的應用與眾不同

在這個由數據驅動的時代&#xff0c;我們每天都在與各種應用程序和服務互動&#xff0c;卻很少意識到它們背后的技術奇跡。API&#xff0c;作為這些互動的幕后英雄&#xff0c;不僅簡化了開發過程&#xff0c;還擴展了技術的邊界。有趣的API&#xff0c;特別是那些能夠激發創新…

QT 如何儲存多種數據類型(QVariant )

QVariant 是 Qt 框架中用于存儲各種數據類型的類。它提供了一個強大的類型系統&#xff0c;允許你在運行時存儲和檢索多種類型的數據&#xff0c;而不需要在編譯時確定類型。QVariant 的主要優點在于它的靈活性和通用性&#xff0c;這使得它在 Qt 的很多組件和機制中都被廣泛使…