深入探索串的高級操作:從算法到 LeetCode 實戰

串是編程中最常用的數據結構之一,從簡單的文本處理到復雜的文本匹配算法,串的應用無處不在。在掌握了串的基本概念、存儲結構以及KMP算法之后,現在讓我們深入探索串的更多高級操作,例如求子串、串的替換等,并通過LeetCode上的題目實戰訓練來進一步提升我們對串的處理能力。

?

一、串的高級操作

(一)求子串

概念 :從一個較長的字符串中提取一個連續的部分作為子串。例如,“hello world” 的子串可以是 “hello”、“world”、“lo wo” 等。

?

Python 實現 :在Python中,求子串非常簡單,可以通過切片操作來實現。

python

def get_substring(s, start, length):

? ? return s[start:start + length]

?

# 示例

text = "hello world"

substring = get_substring(text, 6, 5) # 提取 "world"

print(substring) # 輸出: world

?

(二)串的替換

概念 :在一個字符串中查找特定的子串,并將其替換為另一個字符串。例如,將字符串 "hello world" 中的 "world" 替換為 "everyone",結果為 "hello everyone"。

?

Python 實現 :Python 的 `str.replace()` 方法提供了強大的替換功能。

python

def replace_substring(s, old, new):

? ? return s.replace(old, new)

?

# 示例

text = "hello world"

new_text = replace_substring(text, "world", "everyone")

print(new_text) # 輸出: hello everyone

?

(三)字符串反轉

概念 :將字符串中的字符順序完全顛倒。例如,“hello” 反轉后變為 “olleh”。

?

Python 實現 :可以通過切片操作或 `reversed` 函數來實現。

python

def reverse_string(s):

? ? return s[::-1]

?

# 或者

def reverse_string(s):

? ? return ''.join(reversed(s))

?

# 示例

text = "hello"

reversed_text = reverse_string(text)

print(reversed_text) # 輸出: olleh

?

(四)字符串去重

概念 :去除字符串中的重復字符,只保留第一次出現的字符。例如,“abcabc” 去重后變為 “abc”。

?

Python 實現 :可以使用集合來記錄已經出現過的字符。

python

def remove_duplicates(s):

? ? seen = set()

? ? result = []

? ? for char in s:

? ? ? ? if char not in seen:

? ? ? ? ? ? seen.add(char)

? ? ? ? ? ? result.append(char)

? ? return ''.join(result)

?

# 示例

text = "abcabc"

unique_text = remove_duplicates(text)

print(unique_text) # 輸出: abc

?

二、LeetCode 實戰題目訓練

(一)【題目】:無重復字符的最長子串(LeetCode 3)

題目描述 :給定一個字符串,找出其中不含有重復字符的最長子串的長度。

?

解題思路 :使用滑動窗口技術。用兩個指針表示一個窗口的左右邊界,移動右邊界擴展窗口,當遇到重復字符時,移動左邊界收縮窗口。同時維護一個集合記錄窗口內的字符,以及一個變量記錄最長無重復子串的長度。

?

Python 實現 :

def length_of_longest_substring(s):

? ? char_set = set()

? ? left = 0

? ? max_length = 0

? ? for right in range(len(s)):

? ? ? ? while s[right] in char_set:

? ? ? ? ? ? char_set.remove(s[left])

? ? ? ? ? ? left += 1

? ? ? ? char_set.add(s[right])

? ? ? ? max_length = max(max_length, right - left + 1)

? ? return max_length

?

# 示例

text = "abcabcbb"

print(length_of_longest_substring(text)) # 輸出: 3

?

(二)【題目】:字符串中的第一個唯一字符(LeetCode 387)

?

題目描述 :給定一個字符串,找到第一個不重復的字符,并返回其在字符串中的位置。如果不存在,則返回 -1。

?

解題思路 :可以使用哈希表統計每個字符的出現次數,然后再次遍歷字符串找到第一個出現次數為1的字符的位置。

?

Python 實現 :

def first_uniq_char(s):

? ? char_count = {}

? ? for char in s:

? ? ? ? char_count[char] = char_count.get(char, 0) + 1

? ? for index, char in enumerate(s):

? ? ? ? if char_count[char] == 1:

? ? ? ? ? ? return index

? ? return -1

?

# 示例

text = "leetcode"

print(first_uniq_char(text)) # 輸出: 0

?

(三)【題目】:字符串的排列(LeetCode 567)

?

題目描述 :給定兩個字符串 s1 和 s2,寫一個函數來判斷 s2 是否包含 s1 的排列。換句話說,第一個字符串的排列之一是第二個字符串的子串。

?

解題思路 :使用滑動窗口和哈希表來解決。維護一個窗口,使窗口內的字符計數與 s1 的字符計數相匹配。如果匹配成功,則 s2 包含 s1 的排列。

?

Python 實現 :

def check_inclusion(s1, s2):

? ? from collections import Counter

? ? len1, len2 = len(s1), len(s2)

? ? if len1 > len2:

? ? ? ? return False

? ? counter1 = Counter(s1)

? ? counter2 = Counter(s2[:len1])

? ? if counter1 == counter2:

? ? ? ? return True

? ? for i in range(len1, len2):

? ? ? ? counter2[s2[i]] += 1

? ? ? ? counter2[s2[i - len1]] -= 1

? ? ? ? if counter2[s2[i - len1]] == 0:

? ? ? ? ? ? del counter2[s2[i - len1]]

? ? ? ? if counter1 == counter2:

? ? ? ? ? ? return True

? ? return False

?

# 示例

s1 = "ab"

s2 = "eidbaooo"

print(check_inclusion(s1, s2)) # 輸出: True

?

三、總結與交流

通過深入學習串的高級操作,包括求子串、串的替換、字符串反轉和去重,我們進一步拓展了對串的處理能力。同時,通過在LeetCode上解決一系列與串相關的題目,我們不僅鞏固了理論知識,還提升了解決實際問題的能力。

聽聽大家在學習串的高級操作和解決LeetCode題目過程中的體驗和見解。有沒有在解決某個題目時發現獨特的解題思路?或者在實際項目中應用這些操作時遇到了什么挑戰?歡迎在評論區分享你的故事,讓我們一起交流學習,共同進步!

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

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

相關文章

在rocky linux 9.5上在線安裝 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在網絡上搜索onenet,注冊并且登錄賬號。 2.產品服務-----物聯網服務平臺立即體驗 3.在底下找到立即體驗進去 4.產品開發------創建產品 5.關鍵是選擇MQTT,其他的內容自己填寫 6.這里產品以及開發完成,接下來就是添加設…

【Fiddler工具判斷前后端Bug】

Fiddler工具判斷前后端Bug的方法 使用Fiddler抓包工具可以高效定位問題是出在前端還是后端,主要通過分析請求和響應的內容、狀態碼、數據格式等關鍵信息。 分析請求是否成功發送 檢查請求是否從客戶端正確發出,觀察Fiddler抓取的請求列表。若請求未出…

【論文閱讀筆記】《A survey on deep learning approaches for text-to-SQL》

文章目錄 一、論文基本信息1. 文章標題2. 所屬刊物/會議3. 發表年份4. 作者列表5. 發表單位 二、摘要三、解決問題四、創新點五、自己的見解和感想六、研究背景七、研究方法(模型、實驗數據、評估指標)八、總結(做了什么、得到了什么、有什么…

【強連通分量 縮點 最長路 拓撲排序】P2656 采蘑菇|普及+

本文涉及知識點 C圖論 強連通分量 縮點 最長路 拓撲排序 P2656 采蘑菇 題目描述 小胖和 ZYR 要去 ESQMS 森林采蘑菇。 ESQMS 森林間有 N N N 個小樹叢, M M M 條小徑,每條小徑都是單向的,連接兩個小樹叢,上面都有一定數量的…

Dubbo Logback 遠程調用攜帶traceid

背景 A項目有調用B項目的服務&#xff0c;A項目使用 logback 且有 MDC 方式做 traceid&#xff0c;調用B項目的時候&#xff0c;traceid 沒傳遞過期&#xff0c;導致有時候不好排查問題和鏈路追蹤 準備工作 因為使用的是 alibaba 的 dubbo 所以需要加入單獨的包 <depend…

nodejs:用 nodemailer 發送一封帶有附件的郵件

我們將使用 nodemailer 庫來發送帶有附件的郵件。 首先&#xff0c;確保已經安裝了nodemailer。如果沒有安裝&#xff0c;可以通過 npm install nodemailer 來安裝。 cnpm install nodemailer --save dependencies: – nodemailer ^7.0.3 步驟&#xff1a; 引入nodemailer模…

Scade 語言概念 - 方程(equation)

在 Scade 6 程序中自定義算子(Operator)的定義、或數據流定義(data_def)的內容中&#xff0c;包含一種基本的語言結構&#xff1a;方程(equation)(注1)。在本篇中&#xff0c;將敘述 Scade 語言方程的文法形式&#xff0c;以及作用。 注1: 對 Scade 中的 equation, 或 equation…

STM32開發,創建線程棧空間大小判斷

1. 使用RTOS提供的API函數&#xff08;以FreeRTOS為例&#xff09; 函數原型&#xff1a;UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask)功能&#xff1a;獲取指定任務堆棧中剩余的最小空間&#xff08;以字為單位&#xff0c;非字節&#xff09;。使用步驟&am…

thinkphp8.1 調用巨量廣告API接口,刷新token

1、在mysql中建立表sys_token; CREATE TABLE sys_token (id int UNSIGNED NOT NULL,access_token varchar(50) COLLATE utf8mb4_general_ci NOT NULL,expires_in datetime NOT NULL,refresh_token varchar(50) COLLATE utf8mb4_general_ci NOT NULL,refresh_token_expires_in …

【leetcode】遞歸,回溯思想 + 巧妙解法-解決“N皇后”,以及“解數獨”題目

&#x1f4da;?前言 &#x1f31f; 本期內容亮點&#xff1a;我們將深入解析力扣&#xff08;LeetCode&#xff09;上的幾道經典算法題&#xff0c;涵蓋不同難度和題型&#xff0c;幫助大家掌握解題思路和代碼實現技巧。無論是準備面試還是提升算法能力&#xff0c;這些題解都…

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越獄教程

前言 越獄iPhone之后&#xff0c;一定記得安裝一下用于屏蔽更新的描述文件&#xff08;可使用愛思助手&#xff09; 因為即便關閉了自動更新&#xff0c;iPhone仍會在某些時候自動更新系統&#xff0c;導致越獄失效&#xff1b;更為嚴重的是&#xff0c;更新后的iOS版本可能是…

??高頻通信與航天電子的材料革命:獵板PCB高端壓合基材技術解析??

—聚酰亞胺/陶瓷基板在5G與航天場景的產業化應用?? ??一、極端環境材料體系&#xff1a;突破溫域與頻率極限?? ??聚酰亞胺基板&#xff08;PI&#xff09;的航天級穩定性?? 獵板在衛星通信PCB中采用真空層壓工藝處理聚酰亞胺基材&#xff08;Dk≈10.2&#xff09;&a…

pikachu靶場通關筆記13 XSS關卡09-XSS之href輸出

目錄 一、href 1、常見取值類型 2、使用示例 3、安全風險 二、源碼分析 1、進入靶場 2、代碼審計 3、滲透思路 三、滲透實戰 1、注入payload1 2、注入payload2 3、注入payload3 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關&#xff09;滲透集合&#xff…

day26-計算機網絡-4

1. tcp的11種狀態 ss -ant -a 表示看所有狀態 -n 表示不將ip解析為主機名 -t 表示tcp 1.1. closed狀態&#xff08;客戶端、服務端&#xff09; 客戶端發起建立連接前的狀態服務端啟動服務前的狀態 1.2. listen狀態&#xff08;服務端&#xff09; 服務端軟件運行的時候狀…

基于autodl部署Cross-Modal-Re-ID-baseline

https://arxiv.org/abs/2001.04193 https://github.com/mangye16/Cross-Modal-Re-ID-baseline/tree/master?tabreadme-ov-file# 需要SYSU-MM01.zip pip install numpy pandas scipy scikit-learn pillow tqdm把SYSU-MM01放到…/Datasets/SYSU-MM01/ori_data下 先運行pytho…

線程安全集合

前置閱讀&#xff1a; 數據結構等算法概念 樹堆排序 鎖相關概念&#xff1a; 鎖概念鎖實現 隊列 Queue 與 Deque 的區別 Queue 是單端隊列&#xff0c;只能從一端插入元素&#xff0c;另一端刪除元素&#xff0c;實現上一般遵循 先進先出&#xff08;FIFO&#xff09; 規則…

ESP32與STM32

ESP32與STM32深度對比&#xff1a;物聯網與嵌入式開發的王者之爭 一、核心架構對比 1.1 ESP32 - 無線物聯網霸主 // 典型雙核架構配置 #include "freertos/FreeRTOS.h" #include "freertos/task.h"void app_main() {// 核心0執行無線通信任務xTaskCreat…

在SpringBoot中使用AWS SDK實現郵箱驗證碼服務

1.依賴導入&#xff08;maven&#xff09; <dependency><groupId>software.amazon.awssdk</groupId><artifactId>ses</artifactId><version>2.31.46</version></dependency> 2.申請兩個key 發件人郵箱需要驗證&#xff1a; …

從零到一:Maven 快速入門教程

目錄 Maven 簡介Maven 是什么為什么使用 Maven&#xff1f; 安裝 Maven下載 Maven 配置 Maven解壓文件配置本地倉庫保存路徑配置國內倉庫地址 Maven 的核心概念了解 pom.xml 文件坐標依賴范圍生命周期compileprovidedruntimetestsystemimport 依賴傳遞依賴排除依賴循環 繼承1. …