【9】數據結構的串篇章

目錄標題

    • 串的定義
    • 順序串的實現
        • 初始化
        • 賦值
        • 打印串
        • 求串的長度
        • 復制串
        • 判斷兩個串長度是否相等
        • 連接兩個串
        • 比較兩個串內容是否相等
        • 插入操作
        • 刪除操作
        • 調試與代碼合集
    • 串的模式匹配算法
      • 樸素的模式匹配算法
      • KMP算法實現模式匹配

串的定義

  • 定義:由0個或多個字符組成的有限序列,由一對雙引號引起來。記為"S"

順序串的實現

初始化
    def __init__(self):"""串初始化"""self.str = list()self.length = ()
賦值
    def strAssign(self, string):"""賦值:param string: 待賦值的串:return:"""# 計算串的長度length = len(string)# 賦值self.str = list()for i in range(length):self.str.append(string[i])# 設置串的長度self.length = length
打印串
    def display(self):"""打印:return:"""print('當前串的長度:', end='')for i in range(self.length):print(self.str[i], end='')print()
求串的長度
    def getLength(self):"""求串的長度:return: 串的長度"""return self.length
復制串
    def strCopy(self, string):"""復制串:param string: 待復制的串:return:"""# 將當前串初始化self.str = list()# 循環復制for char in string.str:self.str.append(char)# 設置當前串的長度self.length = string.getLength()
判斷兩個串長度是否相等
    def strEquals(self, string):"""判斷兩個串是否相等:param string: 待判定是否相等的串:return: 是否相等 true or false"""if self.length == string.getLength():# 循環,逐一比較for i in range(self.length):if self.str[i] != string.str[i]:break# 判斷,如果i等于串的長度,則相等:否則不相等i += 1if i == self.length:return Trueelse:return Falseelse:return False
連接兩個串
    def strConnect(self, string2):"""連接兩個串:param string2: 串2:return:"""# 生成新串,并初始化newString = String()# 循環for i in range(self.length):newString.str.append(self.str[i])# 循環for i in range(string2.getLength()):newString.str.append(string2.str[i])# 設置串的長度newString.length = self.length + string2.getLength()return newString
比較兩個串內容是否相等
    def strCompete(self, string):"""兩個串比較大小:param string: 帶比較大小的串:return: 1為大于,0為等于,-1為小于"""# 循環,逐個比較兩個串相應位置的字符大小index = 0while index < self.length and index < string.getLength():if self.str[index] > string.str[index]:return 1elif self.str[index] < string.str[index]:return -1index += 1# 判斷兩個串是否還有字符,還存在字符的串大if index < self.length:return 1elif index < string.getLength():return -1else:return 0
插入操作
    def insert(self, offset, string):"""插入:param offset: 插入位置:param string::return:"""# 判斷位置是否正確if offset < 0 or offset > self.length:print("插入位置不合法!")return# 備份當前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 將待插入的串存入當前串for i in range(string.getLength()):self.str.append(string.str[i])# 將目標串剩余字符存入當前串for i in range(offset, self.length):self.str.append(temp[i])# 設置串的長度self.length = self.length + string.getLength()
刪除操作
    def delete(self, offset, len):"""刪除:param offset: 刪除開始位置:param len: 刪除長度:return:"""# 判斷位置與長度是否合法if offset < 0 or offset > self.length or len > self.length - offset:print('刪除位置不合法!')return# 備份當前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 將目標串剩余的字符存入當前串for i in range(offset + len, self.length):self.str.append(temp[i])# 設置串的長度self.length = self.length - len
調試與代碼合集
class String:"""串的定義"""def __init__(self):"""串初始化"""self.str = list()self.length = ()def strAssign(self, string):"""賦值:param string: 待賦值的串:return:"""# 計算串的長度length = len(string)# 賦值self.str = list()for i in range(length):self.str.append(string[i])# 設置串的長度self.length = lengthdef display(self):"""打印:return:"""print('當前串的長度:', end='')for i in range(self.length):print(self.str[i], end='')print()def getLength(self):"""求串的長度:return: 串的長度"""return self.lengthdef strCopy(self, string):"""復制串:param string: 待復制的串:return:"""# 將當前串初始化self.str = list()# 循環復制for char in string.str:self.str.append(char)# 設置當前串的長度self.length = string.getLength()def strEquals(self, string):"""判斷兩個串是否相等:param string: 待判定是否相等的串:return: 是否相等 true or false"""if self.length == string.getLength():# 循環,逐一比較for i in range(self.length):if self.str[i] != string.str[i]:break# 判斷,如果i等于串的長度,則相等:否則不相等i += 1if i == self.length:return Trueelse:return Falseelse:return Falsedef strConnect(self, string2):"""連接兩個串:param string2: 串2:return:"""# 生成新串,并初始化newString = String()# 循環for i in range(self.length):newString.str.append(self.str[i])# 循環for i in range(string2.getLength()):newString.str.append(string2.str[i])# 設置串的長度newString.length = self.length + string2.getLength()return newStringdef strCompete(self, string):"""兩個串比較大小:param string: 帶比較大小的串:return: 1為大于,0為等于,-1為小于"""# 循環,逐個比較兩個串相應位置的字符大小index = 0while index < self.length and index < string.getLength():if self.str[index] > string.str[index]:return 1elif self.str[index] < string.str[index]:return -1index += 1# 判斷兩個串是否還有字符,還存在字符的串大if index < self.length:return 1elif index < string.getLength():return -1else:return 0def insert(self, offset, string):"""插入:param offset: 插入位置:param string::return:"""# 判斷位置是否正確if offset < 0 or offset > self.length:print("插入位置不合法!")return# 備份當前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 將待插入的串存入當前串for i in range(string.getLength()):self.str.append(string.str[i])# 將目標串剩余字符存入當前串for i in range(offset, self.length):self.str.append(temp[i])# 設置串的長度self.length = self.length + string.getLength()def delete(self, offset, len):"""刪除:param offset: 刪除開始位置:param len: 刪除長度:return:"""# 判斷位置與長度是否合法if offset < 0 or offset > self.length or len > self.length - offset:print('刪除位置不合法!')return# 備份當前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 將目標串剩余的字符存入當前串for i in range(offset + len, self.length):self.str.append(temp[i])# 設置串的長度self.length = self.length - lenif __name__ == '__main__':# 16.串string1 = String()str = input('請輸入你的第1個串的內容:')string1.strAssign(str)string1.display()print(f"當前string1串的長度為:{string1.getLength()}")# 復制string2 = String()str = input('請輸入你的第2個串的內容:')string2.strAssign(str)string2.display()print(f"當前string2串的長度為:{string2.getLength()}")# string1.strCopy(string2)string1.display()print(f"當前string1串的長度為:{string1.getLength()}")# 判斷是否相等串result = string1.strEquals(string2)if result:print('兩個串相等')else:print('兩個串不相等')# 連接兩個串string3 = string1.strConnect(string2)string3.display()print(f"當前string3串的長度為:{string3.length}")# 兩個串比較大小result = string1.strCompete(string2)if result == 1:print('string1 大于 string2')elif result == -1:print("string1 小于 string2")else:print('string1 等于 string2')# 插入string1.insert(3, string2)string1.display()print(f"當前string1的長度為:{string1.length}")# 刪除string1.delete(3, 2)string1.display()print(f"當前string1的長度為:{string1.length}")

串的模式匹配算法

樸素的模式匹配算法

  • 核心思路
    • 也稱為暴力搜索算法。
    • 從目標串S的第一個字符開始與模式串P的第一個字符進行匹配
    • 如果匹配,繼續逐個匹配后續字符,
    • 如果不匹配,模式串P返回到第一個字符,與目標串S的第二個字符進行匹配,
    • 如果匹配,繼續逐個匹配后續字符,
    • 如果不匹配,模式串P返回到第一個字符,與目標串S的第三個字符進行匹配,
    • 以此類推…
  • 最好情況:從第一個字符開始就匹配成功,模式串數量m,則時間復雜度為O(m)
  • 最壞情況:沒有匹配成功,每次匹配比較m次,共匹配n-m+1次,時間復雜度為O(n×m).
  • 代碼實現
def bruteForce(string1, string2):"""暴力模式匹配:param string2::return:"""i = 0j = 0while i < len(string1) and j < len(string2):if string1[i] == string2[j]:j += 1i += 1else:i = i-j+1j = 0# 如果找到返回索引if j == len(string2):index = i - len(string2)# 否則返回-1else:index = -1return indexif __name__ == '__main__':string1 = "ababdabcd"string2 = "abc"print(bruteForce(string1, string2) + 1)

KMP算法實現模式匹配

  • 核心思路
    • next列表的設計與生成。

    • 使用前后綴列表的方式去解析next值的設定

    • 其中:

      • 前綴列表表示除去最后一個字符后的前面所有子串組成的集合;
      • 后綴列表表示除去第一個字符后的后面所有子串組成的集合。
    • 以“abcabd”為例,求的next列表

    • 1.串‘a’的前綴和后綴均為空集,最長共有元素長度為0,

    • 2.串“ab”的前綴為{“a”},后綴集合為{‘b’},沒有相同的前后綴的子串,最長共有元素長度為0,

    • 3.串“abc”的前綴集合為{“a”,“ab”},后綴為{“c”,“bc”},沒有相同的前后綴的子串,最長共有元素長度為0,

    • 4.串“abca”的前綴集合為{“a”,“ab”,“abc”},后綴為{“a”,“ca”,“bca”},相同的前后綴子串為“a”,最長共有元素長度為1,

    • 5.串“abcab”的前綴集合為{“a”,“ab”,“abc”,“abca”},后綴為{“b”,“ab”,“cab”,“bcab”},相同的前后綴子串為“ab”,最長共有元素長度為2,

    • 6.串“abcabd”的前綴集合為{“a”,“ab”,“abc”,“abca”,“abcab”},后綴為{“d”,“bd”,“abd”,“cabd”,“bcabd”},沒有相同的前后綴子串,最長共有元素長度為0,

    • 7.最后得出字符串“abcabd”的next列表為[-1,0,0,0,1,2].

  • 代碼實現
def createNext(pattern):length = len(pattern)# 定義next列表next = [0 for _ in range(len(pattern))]next[0] = -1next[1] = 0# 計算next列表k = -1j = 0while j < length-1:if pattern[k] == pattern[j] or k == -1:j += 1k += 1next[j] = kelse:k = next[k]print(next)return nextdef kmpSearch(text, pattern):# 得到next列表next = createNext(pattern)# 匹配字符串i = 0j = 0while i < len(text) and j < len(pattern):if text[i] == pattern[j] or j == -1:i += 1j += 1else:j = next[j]if j >= len(pattern):return Trueelse:return Falseif __name__ == '__main__':text = "ababdabcabcabd"pattern = "abcabd"print(kmpSearch(text, pattern))

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

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

相關文章

GMSL Strapping Pins CFG0/CFG1 應用

GMSL device 使用起來還是比較簡單 ADI 已經充分考慮了用戶的需求&#xff0c;盡可能的降低的芯片的使用和配置復雜度 一對加串器和解串器&#xff0c;只要工作模式匹配得當&#xff0c;Link Locked&#xff0c;便能夠正常工作 如果遇到 Link 無法建立&#xff08;Locked&…

`uia.WindowControl` 是什么:獲取窗口文字是基于系統的 UI 自動化接口,而非 OCR 方式

uia.WindowControl 是什么:獲取窗口文字是基于系統的 UI 自動化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系統的 UI 自動化框架(如 pywinauto 中的 uia 模塊)里用于表示窗口控件的類。在 Windows 操作系統中,每個應用程序的窗口都可以看作是一個控件,ui…

Easysearch VS Opensearch 數據寫入與存儲性能對比

本文記錄 Easysearch 和 Opensearch 數據寫入和數據存儲方面的性能對比。 準備 壓測工具&#xff1a;INFINI Loadgen 對比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 節點 JVM 配置…

力扣題解:142. 環形鏈表 II

在鏈表學習中&#xff0c;我們已經了解了單鏈表和雙鏈表&#xff0c;兩者的最后一個結點都會指向NULL&#xff1b;今天我們介紹的循環列表則不同&#xff0c;其末尾結點指向的這是鏈表中的一個結點。 循環鏈表是一種特殊類型的鏈表&#xff0c;其尾節點的指針指向頭節點&#…

區間 dp 系列 題解

1.洛谷 P4342 IOI1998 Polygon 我的博客 2.洛谷 P4290 HAOI2008 玩具取名 題意 某人有一套玩具&#xff0c;并想法給玩具命名。首先他選擇 W, I, N, G 四個字母中的任意一個字母作為玩具的基本名字。然后他會根據自己的喜好&#xff0c;將名字中任意一個字母用 W, I, N, G …

天基光學圖像仿真原理簡介

一、原理簡介 天基光學圖像仿真通過數學模型和算法模擬空間目標在光學系統中的成像過程&#xff0c;核心原理可歸納為以下四部分&#xff1a; 1. 目標與背景建模? 目標運動建模?&#xff1a;利用軌道動力學模型&#xff08;如SGP4&#xff09;解析空間目標軌跡&#xff0c;…

Jetpack Compose 狀態保存機制全面解析:讓UI狀態持久化

在Android開發中&#xff0c;Jetpack Compose 的狀態管理是一個核心話題&#xff0c;而狀態保存則是確保良好用戶體驗的關鍵。本文將深入探討Compose中各種狀態保存技術&#xff0c;幫助你在配置變更和進程重建時保持UI狀態。 一、基礎保存&#xff1a;rememberSaveable reme…

【Json-Rpc #1】項目背景及環境搭建

&#x1f4c3;個人主頁&#xff1a;island1314 &#x1f525;個人博客&#xff1a;island ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活總是不會一帆風順&#xff0c;前進…

WPF輪播圖動畫交互 動畫縮放展示圖片

WPF輪播圖動畫交互 動畫縮放展示圖片 效果如下圖&#xff1a; XAML代碼&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…

為什么 npm list -g 沒顯示 node_modules??

揭秘&#xff1a;為什么 npm list -g 沒顯示 node_modules&#xff1f;&#x1f575;??♂?? 嗨&#xff0c;各位代碼探險家&#xff01;&#x1f44b; 今天我們要破解一個 npm 小謎團&#xff1a;運行 npm list -g --depth0 時&#xff0c;為什么輸出的路徑里看不到 node_…

都江堰與鄭國渠

目錄標題 一、歷史背景&#xff1a;地緣博弈下的水利突圍都江堰&#xff1a;化水患為天府的千年大計鄭國渠&#xff1a;間諜引發的戰略反轉 二、工程智慧&#xff1a;超越時代的科技奇跡都江堰&#xff1a;生態治水的典范鄭國渠&#xff1a;泥沙資源化的創舉 三、后世影響&…

鏈路聚合+vrrp

1.鏈路聚合 作用注意事項將多個物理接口&#xff08;線路&#xff09;邏輯上綁定在一起形成一條邏輯鏈路&#xff0c;起到疊加帶寬的作用1.聚合接口必須轉發速率一致。2.聚合設備兩端必須一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先創建聚合接口&#xff0c;…

【STM32單片機】#7 定時器輸入捕獲

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 實驗&…

【android bluetooth 框架分析 01】【關鍵線程 3】【bt_jni_thread 線程介紹】

1. bt_jni_thread 職責介紹 bt_jni_thread 這個線程的作用是專門負責處理藍牙 JNI 層的消息循環&#xff0c;也可以說是 C 層和 Java 層交互的橋梁線程。 1.1 什么是 JNI 層&#xff1f;為什么需要這個線程&#xff1f; JNI&#xff08;Java Native Interface&#xff09;是 …

基于視覺語言模型的機器人實時探索系統!ClipRover:移動機器人零樣本視覺語言探索和目標發現

作者&#xff1a;Yuxuan Zhang 1 ^{1} 1, Adnan Abdullah 2 ^{2} 2, Sanjeev J. Koppal 3 ^{3} 3, and Md Jahidul Islam 4 ^{4} 4單位&#xff1a; 2 , 4 ^{2,4} 2,4佛羅里達大學電氣與計算機工程系RoboPI實驗室&#xff0c; 1 , 3 ^{1,3} 1,3佛羅里達大學電氣與計算機工程系F…

SpringBoot和微服務學習記錄Day2

微服務 微服務將單體應用分割成更小的的獨立服務&#xff0c;部署在不同的服務器上。服務間的關聯通過暴露的api接口來實現 優點&#xff1a;高內聚低耦合&#xff0c;一個模塊有問題不影響整個應用&#xff0c;增加可靠性&#xff0c;更新技術方便 缺點&#xff1a;增加運維…

網站集群批量管理-Ansible劇本與變量

復盤內容&#xff1a;鏈接指北 查看ansible命令文檔 ansible-doc -s systemd一、劇本 何為劇本: playbook 文件,用于長久保存并且實現批量管理,維護,部署的文件. 類似于腳本存放命令和變量 劇本yaml格式,yaml格式的文件:空格,冒號. 劇本未來我們批量管理,運維必會的內容. …

如何在Dify中安裝運行pandas、numpy庫(離線、在線均支持,可提供遠程指導)

pandas和numpy這兩個庫是數據科學和數據分析中經常使用的工具包&#xff0c;原生的Dify無法直接使用這兩個庫&#xff0c;需要手動安裝后才可以使用。本文將介紹如何在Dify中安裝pandas和numpy&#xff0c;并在代碼執行節點中運行使用pandas和numpy。 Dify的代碼執行節點中的py…

Helm核心概念與常見操作介紹

在管理Kubernetes集群里的應用時&#xff0c;Helm能幫上大忙&#xff0c;它把應用的部署、升級和管理變得簡單多了&#xff0c;有如是Kubernetes的 “應用商店”。 Helm的三個重要概念 三大概念最直接的理解&#xff1a;Helm 安裝 charts 到 Kubernetes 集群中&#xff0c;每…

rkmpp 解碼 精簡mpi_dec_test.c例程

rkmpp 解碼流程&#xff08;除 MPP_VIDEO_CodingMJPEG 之外&#xff09; 源碼 輸入h264碼流 輸出nv12文件 /** Copyright 2015 Rockchip Electronics Co. LTD** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file exce…