KMP 算法相關練習題

大家好,今天是2025年8月31日,上一期我給大家分享了 KMP 算法的相關知識,今天我來帶領大家學習4道 KMP 相關的算法題

在學習算法題之前,還是希望大家能夠要先學會 KMP 算法(可以參考這篇文章:KMP 算法)

當然,如果你是高手的話,也可以自己先嘗試一下解決下面的四道問題,檢驗一下你的 KMP 算法的掌握程度。

那么,廢話不多收,我們開啟今天的學習!!!

題目一:剪花布條

題目鏈接:剪花布條

【題目描述】

【算法原理】

這道題一眼就可以看出是字符串匹配的問題,暴力解法當然是拿著模式串去主串的每一個位置依次進行匹配,時間復雜度較高,但是這道題目數據范圍比較小,應該也是可以通過~~

這種字符串匹配的問題,我們可以嘗試使用 KMP 算法進行解決。

但不同于 KMP 算法模板題的是,這道題目找到所有匹配的位置之后,還要從左到右進行判斷篩選,不能重疊。這個只需要額外判斷匹配位置之間的距離是否大于模式串的長度就可以了。

注意:可見的 ASCII 字符是包括 ‘#’ 的,因此我們用 ‘ ’(空格)來鏈接模式串和主串。

【代碼實現】

#include <iostream>using namespace std;const int N = 2010; // 注意要開成兩倍 string s, t;
int n, m;
int pi[N];int main()
{while(cin >> s >> t){int ret = 0; n = s.size(); m = t.size();s = ' ' + t + ' ' + s;for(int i = 2; i <= m + n + 1; i++){int j = pi[i - 1];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;}for(int i = m + 1; i <= m + n + 1; i++){if(pi[i] == m){ret++;i += m - 1; // 出去以后還會 ++ 一次 // 防重疊 }}cout << ret << endl;}return 0;
}

題目二:Seek the Name

題目鏈接:Seek the Name

【題目描述】

【算法原理】

前綴函數的小用途~~

border 的 border 還是 border

題目要求求出字符串所有 border 的長度,我們可以先求出最長的 border 的長度,再依次去找短的 border。這道題目就是一個簡單的求前綴函數的問題~~

用數組存儲所有 border 的長度,最后再逆序輸出。(有一種數組模擬棧的感覺)

最后不要忘記輸出整個字符串的長度~~,求 border 不會考慮,但是本題是要考慮的。

【代碼實現】

#include <iostream>using namespace std;const int N = 4e5 + 10;string s;
int n, pi[N];
int ret[N], top;int main()
{while(cin >> s){top = 0;n = s.size();s = ' ' + s;for(int i = 2; i <= n; i++){int j = pi[i - 1];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;}for(int i = pi[n]; i; i = pi[i]) ret[++top] = i;for(int i = top; i >= 1; i--) cout << ret[i] << " ";cout << n << endl;}return 0;
} 

題目三:ABB

題目鏈接 ABB

【題目描述】

【算法原理】

對于回文串相關的問題,可以使用 malache 算法來解決,但是我們這個專題是 KMP,因此我們嘗試使用 KMP 算法來解決這個問題。

題目轉化:這道題實質上是求給定字符串的最長回文后綴的長度 len,n - len 就是最終結果。

因為題目要求你只能從字符串的末端去補充字符,所以回文后綴的長度越長,你要補充的字符數量就越少。

所以我們只需要解決求出一個字符串的最長回文后綴的長度就可以了~~

如何解決這個問題呢???

我們發現:如果將回文串逆序,應該和原始的字符串相同。因此,我們可以將字符串逆序之后拼接到原始字符串的前面,在中間加一個 ‘#’ 連接。

接下來,我們只需要求出新字符串最長的 border 長度 pi,再用 n - pi 就解決了。

【代碼實現】

#include <iostream>
#include <algorithm>using namespace std;const int N = 8e5 + 10; // 開兩倍 string s, t;
int n;
int pi[N];int main()
{cin >> n >> s;t = s;reverse(t.begin(), t.end());s = ' ' + t + '#' + s;for(int i = 2; i <= n + n + 1; i++){int j = pi[i - 1];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;}cout << n - pi[n + n + 1] << endl;return 0;
}

題目四:Censoring S

題目鏈接:Censoring S

【題目描述】

【算法原理】

KMP 算法 + 棧(存下標)

對于這種類似”消消樂“的玩法,我們很容易想到 “棧” 這樣的一個數據結構

對于之前求前綴函數的模板,我們優先考慮使用【1,i - 1】的 border 來更新 【1,i】的 border

但是這道題目涉及消除的操作,因此我們不能使用【1,i - 1】的 border 來更新 【1,i】的 border(有可能前面的字符都消沒了)

而是使用棧頂下標的元素來更新【1,i】的 border。

【代碼實現】

#include <iostream>using namespace std;const int N = 2e6 + 10;string s, t;
int n, m, pi[N];
int st[N], top; // 用數組模擬棧 int main()
{cin >> s >> t;n = s.size(), m = t.size();s = ' ' + t + ' ' + s;// pi[1] = 0;st[++top] = 1;for(int i = 2; i <= n + m + 1; i++){int j = pi[st[top]];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;st[++top] = i;if(j == m){for(int k = 0; k < m; k++) top--;}}for(int i = m + 2; i <= top; i++) cout << s[st[i]];return 0;
}

好的,今天的分享到這里就結束了,謝謝大家!!!

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

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

相關文章

張柏芝亮相林家謙演唱會 再次演繹《任何天氣》

近日&#xff0c;張柏芝作為特別嘉賓亮相歌手林家謙演唱會。當天&#xff0c;張柏芝身著一襲淺米色蕾絲裙裝&#xff0c;輕盈面料搭配層疊設計&#xff0c;行走間裙擺微揚&#xff0c;溫柔氣質滿溢&#xff0c;為舞臺增添了一抹溫柔亮色。舞臺上&#xff0c;張柏芝接連演繹《任…

Android 權限申請現代化指南

Android 權限申請現代化指南 一、核心概念&#xff1a;權限分類 Android 將權限分為三大類&#xff0c;申請方式各不相同&#xff1a; 普通權限 (Normal Permissions)范圍&#xff1a;涉及應用沙盒外部但對用戶隱私或設備操作風險極低的操作。示例&#xff1a;網絡訪問 (IN…

大話 IOT 技術(3) -- MQTT篇

文章目錄前言前情提要MQTT介紹組成萬惡的appmqtt服務端偽代碼實現開源的力量后話當你迷茫的時候&#xff0c;請點擊 物聯網目錄大綱 快速查看前面的技術文章&#xff0c;相信你總能找到前行的方向 前言 本篇將開始講述IOT技術的一個重點&#xff0c;mqtt協議。 我發現有一個…

大語言模型生成的“超齡勞動者權益保障制度系統化完善建議(修訂版)”

大綱 │ ├── 一、基于征求意見稿現狀的評估 │ ├── 制度意義&#xff1a;25條暫行規定首次明確權益范圍&#xff0c;提供法律依據 │ └── 關鍵缺陷 │ ├── 法律定位不明確 │ ├── 社保銜接不足 │ └── 實施機制不完善 │ ├── 二、法…

【UnityAS】Unity Android Studio 聯合開發快速入門:環境配置、AAR 集成與雙向調用教程

這是一篇2021年的存檔&#xff0c;使用Unity2020版本。 至今&#xff0c;Unity與AS很多通訊方式也是基于此衍生。 作為Unity與AS聯合開發的受益者&#xff0c;難得掏出自己的飯碗&#xff0c;諸君共享&#xff01; Unity & Android Studio 聯合開發快速入門 ——Unity與AS…

前后端聯合實現多個文件上傳

1、前端 Vue3CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 文件輸入實例對象 const fileInputRef ref<HTMLInputElement | null>(null); // 選擇文件列表 const selectedFiles ref<Fi…

軟考高級--系統架構設計師--綜合知識真題解析

系列文章目錄 文章目錄系列文章目錄一、2019年真題二、2020年真題三、2021年真題四、2022年真題總結一、2019年真題 二、2020年真題 三、2021年真題 四、2022年真題 總結

“帕薩特B5鉗盤式制動器結構設計三維PROE模型7張CAD圖紙PDF圖“

摘 要本文首先對汽車制動器原理和對各種各樣的制動器進行分析,詳細地闡述了各類制動器的結構,工作原理和優缺點。再根據轎車的車型和結構選擇了適合的方案。根據市場上同系列車型的車大多數是滑鉗盤式制動器,而且滑動鉗式盤式制動器結構簡單,性能居中,設計規范,所以我選擇滑動…

SQL注入6----(其他注入手法)

一.前言 本章節來介紹一下其他的注入手法&#xff0c;也就是非常規注入手法&#xff0c;來和大家介紹一下 二.加密注入 前端提交的有些數據是加密之后&#xff0c;到了后臺在解密&#xff0c;然后再進行數據庫查詢等相關操作的&#xff0c;那么既然如 此我們也應該將注入語句…

visual studio2022 配置 PCL 1.13.1

PCL庫下載 下載鏈接&#xff1a; https://github.com/PointCloudLibrary/pcl/releases 下載這兩個。 PCL庫安裝 運行.exe文件進行安裝。 環境變量勾第二個&#xff08;其實無所謂&#xff0c;反正還要添加別的環境變量&#xff0c;這里沒選之后加也一樣&#xff09;。 安裝…

金融學-貨幣理論

前言 前面學習了什么是貨幣供給&#xff0c;貨幣供給的決定以及聯邦儲備體系在貨幣供給中所起的作用。現在我們要開始探討經濟中貨幣供給在決定價格水平與全部商品和勞務(總供給)中的作用。關于貨幣對經濟影響的研究&#xff0c;稱為貨幣理論(monetarythe-ory) 貨幣數量論 古典…

Visio繪圖——給多邊形增加連接線

每次在畫項目框圖和各類爪圖的時候&#xff0c;連接線是最煩人的&#xff0c;雖然選擇的是折線&#xff0c;單往往事與愿違。 下面就記錄一下&#xff0c;如何查找各類連接線。 1、先展開左側菜單欄&#xff0c;點擊如下所示的“&#xff1e;”2、在展開的界面&#xff0c;再次…

【開題答辯全過程】以 付費自習室系統小程序為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

開疆智能Profinet轉EtherCAT網關連接TR-Electronic傳感器配置案例

本案例是通過開疆智能研發的Profinet轉EtherCAT網關將傳感器數據傳送到PLC&#xff0c;由于兩邊設備采用協議不同&#xff0c;故而使用網關進行轉換。網關配置&#xff1a;打開網關配置軟件“EtherCAT Manager”并新建項目。根據不通網關型號也可選擇ModbusTCP&#xff0c;Ethe…

VSCode中使用Markdown

文章目錄1. 背景2. 安裝插件3. 基礎寫作與預覽4. 生成PDF文檔5. 插入代碼6. 插入圖片7. 小結1. 背景 編程技術人員&#xff0c;很多人寫作習慣用Markdown格式吧。 首先Markdown很簡單&#xff0c;第二它的層次結構特別清晰&#xff0c;再然后它對嵌入圖片、代碼的支持很優秀。…

2024全棧技術棧選型指南

前后端技術棧選擇現代前后端技術棧選擇需兼顧市場需求與個人興趣。前端領域React、Vue、Angular形成三足鼎立&#xff0c;React在大型項目占比達58%&#xff0c;Vue在小中型企業更受歡迎。TypeScript采用率年增長25%&#xff0c;已成為工程化標配。后端技術呈現多元化趨勢&…

Spring Boot 項目文件上傳安全與優化:OSS、MinIO、Nginx 分片上傳實戰

在實際的 Web 項目中&#xff0c;文件上傳是一個常見需求&#xff1a;用戶上傳頭像、企業后臺上傳資料、視頻平臺上傳大文件等等。然而&#xff0c;文件上傳也是最容易引發安全風險的功能之一&#xff0c;比如惡意腳本上傳、木馬文件偽裝、存儲空間消耗攻擊。同時&#xff0c;當…

智能安防:以AI重塑安全新邊界

傳統安防依賴人力監控與簡單報警&#xff0c;效率低下且易遺漏風險。隨著人工智能、物聯網及大數據技術的融合&#xff0c;智能安防正重新定義安全管理的范式&#xff0c;從被動響應轉向主動預警&#xff0c;成為智慧城市與數字化生活的重要基石。智能安防的核心是人工智能視覺…

【AI】【強化學習】強化學習算法總結、資料匯總、個人理解

前言&#xff1a;自己學習西湖大學趙老師的課、youtube系列的課程相關比較重要的內容&#xff0c;后續不斷再進行完善。 YouTube Serrano.academy rlhf講的很好 合集最后一個沒看 強化學習第四章 police沒一步需要無窮&#xff0c;值迭代只需要一步 收斂不一樣 值迭代:原因在于…

一鍵掌控三線資源:極簡 Shell 腳本實現 CPU·磁盤·內存可視化巡檢

目錄 前言 數值型 for 循環 語法格式 示例&#xff1a;打印 1 到 5 示例&#xff1a;打印5次Hello World 示例&#xff1a;計算 1 到 100 的累加和 遍歷型 for 循環 語法格式 示例&#xff1a;遍歷字符串列表 示例&#xff1a;遍歷數組 示例&#xff1a;遍歷文件列表…