串及BF樸素查找算法(學習整理):

關于串的相關定義:

  1. 串:用‘ ’表示的字符序列
  2. 空串:包含零個字符的串
  3. 子串:包含傳本身和空串的子串
    1. eg: 'abc'
    2. ('','a','b','c','ab','bc','ac','abc)
    3. 共7個:串的長度的階乘+1(空串)
  4. 真子串:不包含自身的所有字串
    1. eg: 'abc'
    2. ('','a','b','c','ab','ac','bc')
    3. 共6個:串的長度的階乘
  5. 空格串:一個或多個空格組成的串

串與字符串的比較:

串:

字符串:

‘ ’ 單引號表示

"" 雙引號表示

字符后直接‘ 結尾

字符串結尾默認“\0”

串的長度為字符數

字符串長度為字符數+1(“\0”)

空串: ‘’

空字符串: ”“

BF(樸素查找算法):

問題描述:

在主串str1 中查找子串str2 的位置,若主串中包含字串則返回主串中位置,否則返回-1;

查找引例:
  1. 主串:"ababcabcdabcde 子串:"abcd"
  2. 主串:"aaaaab" 子串:"aaaab"

思路引入:

在例1:主串依次遍歷字串,當遇到與字串不匹配時,主串指針直接向后遍歷,子串從頭便利

例2:主串若如例1思路,主串指針不向后倒退,直接向后遍歷則無法得到正確查找答案

BF算法思想:

從主串的pos 位置與字串的字符進行比較,相等時兩個串的指針皆向后移動;

不等時:主串倒退到此次開始遍歷子串的位置的下一位置,子串指針回到開頭,重新開始比較;

具體實現:

int main()
{const char *str1 = "ababcabcdabcdeabcdabcdd";//主串//const char* str1 = "abcd";const char* str2 = "abcd";//子串int j =0;//pos位置while(j!=-1){j = BF(str1, str2, j);printf("返回類比pos位置:%d\n", j);if (j == -1)break;j += strlen(str2);}return 0;
}

int BF(const char* str1, const char* str2, int pos)
{assert(str1 != NULL && str2 != NULL);int len1 = strlen(str1);int len2 = strlen(str2);if (pos < 0||pos>=strlen(str1)||str1==NULL||str2==NULL)return -1;int i ; int j = 0;i = pos;while(i<len1&&j<len2){if (str1[i] == str2[j]){i++;j++;}else{i = i - j+1;j = 0;}	}if (j == len2)return i - j;return -1;
}
函數功能:
  1. 判斷參數是否有效;
  2. 計算兩個字符串的長度(strlen()函數計算不包含"\0"的長度);
  3. 分別用 "i" "j" 代表兩個字符串的指針下標
  4. 相等:++,向后遍歷
  5. 不等: i 回到開始位置的下一位置,j 回到開頭
  6. 當子串匹配且遍歷完即代表查找成功

代碼提示:

  • 字符串比較只能用”strcmp()"函數,同時單個字符無法使用該函數比較,等號比較即可;
//判斷相等:
//error:
strcmp(str1[i],str2[j])==0;//right:
str1[i]==str2[j];
  • %s :只能輸出字符串,不能輸出字符 eg:不能!str[i]
  • %c:輸出單個字符,無法輸出字符串 eg:可以 str[i]

由結果輸出可知:

該串從零號下標開始,第5,9,14,18位置均找到了子串

算法重點:
  1. 主串指針回退到開始遍歷的下一位置
  2. 子串回退到開頭
  3. 當子串遍歷成功即代表查找成功

BF算法時間復雜度:

主串長度m,子串長度n;

最差情況:若主串中不包含子串時

主串遍歷了最多(n)遍子串(m)

由此可得:O(m*n)

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

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

相關文章

解讀OWASP應用安全驗證標準ASVS

OWASP應用程序安全驗證標準&#xff08;OWASP Application Security Verification Standard&#xff0c;ASVS&#xff09;為測試web應用程序技術安全控制提供了基礎&#xff0c;還為開發人員提供了安全開發的要求列表。 1. 簡介 OWASP應用安全驗證標準&#xff0c;是一份測試應…

電子電氣架構——AUTOSAR架構下EcuM喚醒源事件詳解

電子電氣架構——AUTOSAR架構下EcuM喚醒源事件詳解 我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 沒有人關注你。也無需有人關注你。你必須承認自己的價值,你不能站在他人的角度來反對自己。人…

Verilog原語、Verilog保留關鍵字

Verilog基元 Vivado合成支持Verilog門級原語&#xff0c;下表所示除外。 Vivado合成不支持Verilog開關級原語&#xff0c;例如以下原語&#xff1a; cmos、nmos、pmos、rcmos、rnmos、rpmos rtran、rtranif0、rtranif1、tran&#xff0c; tranif0&#xff0c;tranif1 門級…

Qt/自定義控件的封裝

新建文件&#xff0c;選擇Qt設計師界面類 創建空界面 這是自己控件封裝的文件&#xff0c;雙擊跳轉到設計界面進行設計 跳轉到其他的ui界面&#xff0c;創建一個widget 右鍵&#xff0c;選擇提升為 在提升的類名稱輸入剛剛創建的類名&#xff0c;添加后選擇提升&#xff0c;勾選…

政安晨【示例演繹虛擬世界開發】(五):從制作一個對戰小游戲開始(Cocos Creator 《擊敗老大》)(第二段)

政安晨的個人主頁&#xff1a;政安晨 歡迎 &#x1f44d;點贊?評論?收藏 收錄專欄: AI虛擬世界大講堂 希望政安晨的博客能夠對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff01; 現在我們已經學會了如何向場景中添加圖片&#xff0c;接下來繼…

計算機設計大賽 深度學習機器視覺車道線識別與檢測 -自動駕駛

文章目錄 1 前言2 先上成果3 車道線4 問題抽象(建立模型)5 幀掩碼(Frame Mask)6 車道檢測的圖像預處理7 圖像閾值化8 霍夫線變換9 實現車道檢測9.1 幀掩碼創建9.2 圖像預處理9.2.1 圖像閾值化9.2.2 霍夫線變換 最后 1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分…

怎么運行/opencv/modules/imgproc/test下的test_cvtyuv.cpp

怎么運行/opencv/modules/imgproc/test下的test_cvtyuv.cpp 要運行test_cvtyuv.cpp&#xff0c;你需要按照以下步驟操作&#xff1a; 獲取OpenCV源代碼&#xff0c;編譯并安裝opencv&#xff1a;首先&#xff0c;確保你已經下載并安裝了OpenCV。如果沒有&#xff0c;請前往Open…

Leetcode630. 課程表 III

Every day a Leetcode 題目來源&#xff1a;630. 課程表 III 解法1&#xff1a;反悔貪心 經驗告訴我們&#xff0c;在準備期末考試的時候&#xff0c;先考的課程先準備。同理&#xff0c;lastDay 越早的課程&#xff0c;應當越早上完。但是&#xff0c;有的課程 duration 比…

2023年09月CCF-GESP編程能力等級認證Scratch圖形化編程四級真題解析

一、單選題(共15題,共30分) 第1題 人們所使用的手機上安裝的 App 通常指的是( )。 A:一款操作系統 B:一款應用軟件 C:一種通話設備 D:以上都不對 答案:B 第2題 下列流程圖的輸出結果是?( ) A:9 B:7 C:5 D:11 答案:A 第3題 默認小貓角色,執行下列程序…

IO,硬盤與文件

IO與計算機存儲空間 IO&#xff08;輸入/輸出&#xff09;是計算機領域中指的是數據在計算機與外部設備之間的傳輸過程。存儲通常指的是計算機中用來保存數據的介質或設備&#xff0c;硬盤是存儲設備的一種&#xff0c;通常是指硬盤驅動器&#xff08;Hard Disk Drive&#xf…

文章解讀與仿真程序復現思路——電網技術EI\CSCD\北大核心《考慮時空相關性的流域水風光多能互補系統高維不確定性場景生成方法》

本專欄欄目提供文章與程序復現思路&#xff0c;具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 這篇文章的標題涵蓋了以下幾個關鍵方…

C語言編程大題

以下總結編程大題的常考題型 1,輸出 100-200 之間所有素數。 要求: (1)編寫一個判斷一個整數是否為素數的函數 void prime(int n),若是素數則輸出,否則不輸出 (2)主函數中調用 prime 函數,輸出 100-200 之間所有素數 說明:素數是指除了1和該數本身之外,不能被其它任何整…

【C++】用命名空間避免命名沖突

&#x1f338;博主主頁&#xff1a;釉色清風&#x1f338;文章專欄&#xff1a;C&#x1f338;今日語錄&#xff1a;如果神明還不幫你&#xff0c;說明他相信你。 &#x1fab7;文章簡介&#xff1a;這篇文章是結合譚浩強老師的書以及自己的理解&#xff0c;同時加入了一些例子…

NOC2023軟件創意編程(學而思賽道)python小高組初賽真題

軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認定的選手所屬學段為準。 二、…

MATLAB知識點:if條件判斷語句的嵌套

?講解視頻&#xff1a;可以在bilibili搜索《MATLAB教程新手入門篇——數學建模清風主講》。? MATLAB教程新手入門篇&#xff08;數學建模清風主講&#xff0c;適合零基礎同學觀看&#xff09;_嗶哩嗶哩_bilibili 節選自?第4章&#xff1a;MATLAB程序流程控制 我們通過一個…

基于springboot+vue的教師工作量管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Java集合-Map接口

在Java中&#xff0c;Map接口表示鍵值對的集合&#xff0c;其中每個鍵都是唯一的&#xff0c;并且每個鍵映射到一個值。Map接口是集合框架中的一部分&#xff0c;位于java.util包中。它定義了一系列操作來管理鍵值對&#xff0c;例如添加鍵值對、刪除鍵值對、獲取鍵對應的值等。…

7.1.1 selenium介紹及安裝chromedriver

目錄 1. Selenium的用途 2. 安裝Selenium庫 3. 安裝chromedriver 1. 查看谷歌版本號?編輯 2. 找到最新版本及下載 3. 配置環境變量 4. 檢測是否配置成功 5. 用python初始化瀏覽器對象檢測&#xff1a; 6. 參考鏈接 1. Selenium的用途 在前面我們提到&#xff1a;在我…

Github項目推薦-LightMirrors

項目地址 https://github.com/NoCLin/LightMirrors 項目簡述 “LightMirrors是一個開源的緩存鏡像站服務&#xff0c;用于加速軟件包下載和鏡像拉取。目前支持DockerHub、PyPI、PyTorch、NPM等鏡像緩存服務。 當前項目仍處于早期階段。”–來自項目說明。 也就是說&#xff…

爆紅提醒:ESLint: Parsing error: Unexpected token. Did you mean `{‘>‘}` or `gt;`?

錯誤情況&#xff1a;> 會爆紅提示&#xff1a;ESLint: Parsing error: Unexpected token. Did you mean {>} or >? function().then((res) > {console.log(res.data); }解決方法&#xff1a;修改.eslintrc或者.eslintrc.js的配置 module.exports {// 其他配置..…