国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動(dòng)態(tài)規(guī)劃--通配字符串匹配

這篇具有很好參考價(jià)值的文章主要介紹了動(dòng)態(tài)規(guī)劃--通配字符串匹配。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 題目來(lái)源
鏈接:通配符匹配
來(lái)源:LeetCode

2. 題目說(shuō)明
給定一個(gè)字符串 (s) 和一個(gè)字符模式 § ,實(shí)現(xiàn)一個(gè)支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何單個(gè)字符。
‘*’ 可以匹配任意字符串(包括空字符串)。

兩個(gè)字符串完全匹配才算匹配成功。

說(shuō)明:

s 可能為空,且只包含從 a-z 的小寫字母。
p 可能為空,且只包含從 a-z 的小寫字母,以及字符 ? 和 *。
示例1:

輸入:
s = “aa”
p = “a”
輸出: false
解釋: “a” 無(wú)法匹配 “aa” 整個(gè)字符串。

示例2:

輸入:
s = “aa”
p = ""
輸出: true
解釋: '’ 可以匹配任意字符串。

示例3:

輸入:
s = “cb”
p = “?a”
輸出: false
解釋: ‘?’ 可以匹配 ‘c’, 但第二個(gè) ‘a(chǎn)’ 無(wú)法匹配 ‘b’。

示例4:

輸入:
s = “adceb”
p = “ab”
輸出: true
解釋: 第一個(gè) ‘’ 可以匹配空字符串, 第二個(gè) '’ 可以匹配字符串 “dce”.

示例5:

輸入:
s = “acdcb”
p = “a*c?b”
輸入: false

題目解析

方法一:

樸素遍歷解法、考慮條件繁多
這道題通配符匹配問(wèn)題還是小有難度的,有特殊字符 ‘ * ’ 和 ‘?’,其中 ‘?’ 能代替任何字符,‘*’ 能代替任何字符串。這道題最大的難點(diǎn),就是對(duì)于星號(hào)的處理,可以匹配任意字符串,簡(jiǎn)直像開了掛一樣,有以下幾點(diǎn):

在星號(hào)對(duì)應(yīng)位置之前,不管你s中有任何字符串,我大星號(hào)都能匹配你,主角光環(huán)啊。
但即便叼如斯的星號(hào),也有其處理不了的問(wèn)題,那就是一旦p中有s中不存在的字符,那么一定無(wú)法匹配,因?yàn)樾翘?hào)只能增加字符,不能消除字符。
再有就是星號(hào)一旦確定了要匹配的字符串,對(duì)于星號(hào)位置后面的匹配情況也就鞭長(zhǎng)莫及了。
所以p串中星號(hào)的位置很重要,用 jStar 來(lái)表示,還有星號(hào)匹配到s串中的位置,使用 iStart 來(lái)表示,這里 iStar 和 jStar 均初始化為 -1,表示默認(rèn)情況下是沒(méi)有星號(hào)的。然后再用兩個(gè)變量i和j分別指向當(dāng)前s串和p串中遍歷到的位置。

開始進(jìn)行匹配:

若i小于s串的長(zhǎng)度,進(jìn)行 while 循環(huán)。
若當(dāng)前兩個(gè)字符相等,或著p中的字符是問(wèn)號(hào),則i和j分別加1。
若 p[j] 是星號(hào),要記錄星號(hào)的位置,jStar 賦為j,此時(shí)j再自增1,iStar 賦為i。
若當(dāng)前 p[j] 不是星號(hào),并且不能跟 p[i] 匹配上,此時(shí)就要靠星號(hào)了,若之前星號(hào)沒(méi)出現(xiàn)過(guò),那么就直接跪,比如 s = “aa” 和 p = “c*”,此時(shí) s[0] 和 p[0] 無(wú)法匹配,雖然 p[1] 是星號(hào),但還是跪。如果星號(hào)之前出現(xiàn)過(guò),可以強(qiáng)行續(xù)一波命,比如 s = “aa” 和 p = “*c”,當(dāng)發(fā)現(xiàn) s[1] 和 p[1] 無(wú)法匹配時(shí),但是好在之前 p[0] 出現(xiàn)了星號(hào),把 s[1] 交給 p[0] 的星號(hào)去匹配。至于如何知道之前有沒(méi)有星號(hào),這時(shí)就能看出 iStar 的作用了,因?yàn)槠涑跏蓟癁?-1,而遇到星號(hào)時(shí),其就會(huì)被更新為i,只要檢測(cè) iStar 的值,就能知道是否可以使用星號(hào)續(xù)命。
雖然成功續(xù)了命,匹配完了s中的所有字符,但是之后還要檢查p串,此時(shí)沒(méi)匹配完的p串里只能剩星號(hào),不能有其他的字符,將連續(xù)的星號(hào)過(guò)濾掉,如果j不等于p的長(zhǎng)度,則返回 false,參見(jiàn)代碼如下:
// 執(zhí)行用時(shí) :8 ms, 在所有 C++ 提交中擊敗了94.73%的用戶
// 內(nèi)存消耗 :9.1 MB, 在所有 C++ 提交中擊敗了78.21%的用戶
class Solution {
public:
? ? bool isMatch(string s, string p) {
? ? ? ? int i = 0, j = 0, iStar = -1, jStar = -1, m = s.size(), n = p.size();
? ? ? ? while (i < m) {
? ? ? ? ? ? if (j < n && (s[i] == p[j] || p[j] == '?')) {
? ? ? ? ? ? ? ? ++i; ++j;
? ? ? ? ? ? } else if (j < n && p[j] == '*') {
? ? ? ? ? ? ? ? iStar = i;
? ? ? ? ? ? ? ? jStar = j++;
? ? ? ? ? ? } else if (iStar >= 0) {
? ? ? ? ? ? ? ? i = ++iStar;
? ? ? ? ? ? ? ? j = jStar + 1;
? ? ? ? ? ? } else return false;
? ? ? ? }
? ? ? ? while (j < n && p[j] == '*') ++j;
? ? ? ? return j == n;
? ? }
};

方法二:動(dòng)態(tài)規(guī)劃解法


這道題也能用動(dòng)態(tài)規(guī)劃來(lái)解,外卡匹配中的星號(hào)跟前面的字符沒(méi)有半毛錢關(guān)系,如果前面的字符沒(méi)有匹配上,那么直接返回 false 了,根本不用管星號(hào)。而星號(hào)存在的作用是可以表示任意的字符串,當(dāng)然只是當(dāng)匹配字符串缺少一些字符的時(shí)候起作用,當(dāng)匹配字符串p包含目標(biāo)字符串s中沒(méi)有的字符時(shí),將無(wú)法成功匹配。

對(duì)于這種玩字符串的題目,動(dòng)態(tài)規(guī)劃是一大神器,因?yàn)樽址渥哟g的關(guān)系十分密切,正好適合 DP 這種靠推導(dǎo)狀態(tài)轉(zhuǎn)移方程的特性。

那么先來(lái)定義dp數(shù)組吧,使用一個(gè)二維 dp 數(shù)組,其中 dp[i][j] 表示 s中前 i 個(gè)字符組成的子串和 p 中前 j 個(gè)字符組成的子串是否能匹配。大小初始化為 (m+1) x (n+1),加1的原因是要包含 dp[0][0] 的情況,因?yàn)槿魋和p都為空的話,也應(yīng)該返回 true,所以也要初始化 dp[0][0] 為 true。還需要提前處理的一種情況是,當(dāng)s為空,p為連續(xù)的星號(hào)時(shí)的情況。由于星號(hào)是可以代表空串的,所以只要s為空,那么連續(xù)的星號(hào)的位置都應(yīng)該為 true,所以先將連續(xù)星號(hào)的位置都賦為 true。

然后就是推導(dǎo)一般的狀態(tài)轉(zhuǎn)移方程,如何更新 dp[i][j],首先處理比較 tricky 的情況:

若p中第j個(gè)字符是星號(hào),由于星號(hào)可以匹配空串,所以如果p中的前 j-1 個(gè)字符跟s中前i個(gè)字符匹配成功了( dp[i][j-1] 為true)的話,則 dp[i][j] 也能為 true?;蛘呷魀中的前j個(gè)字符跟s中的前i-1個(gè)字符匹配成功了( dp[i-1][j] 為true )的話,則 dp[i][j] 也能為 true(因?yàn)樾翘?hào)可以匹配任意字符串,再多加一個(gè)任意字符也沒(méi)問(wèn)題)。
若p中的第j個(gè)字符不是星號(hào),對(duì)于一般情況,假設(shè)已經(jīng)知道了s中前 i-1 個(gè)字符和p中前 j-1 個(gè)字符的匹配情況(即 dp[i-1][j-1] ),現(xiàn)在只需要匹配s中的第i個(gè)字符跟p中的第j個(gè)字符,若二者相等( s[i-1] == p[j-1] ),或者p中的第j個(gè)字符是問(wèn)號(hào)( p[j-1] == ‘?’ ),再與上 dp[i-1][j-1] 的值,就可以更新 dp[i][j] 了,參見(jiàn)代碼如下:
// 執(zhí)行用時(shí) :116 ms, 在所有 C++ 提交中擊敗了43.78%的用戶
// 內(nèi)存消耗 :13.8 MB, 在所有 C++ 提交中擊敗了21.35%的用戶
class Solution {
public:
? ? bool isMatch(string s, string p) {
? ? ? ? int m = s.size(), n = p.size();
? ? ? ? vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
? ? ? ? dp[0][0] = true;
? ? ? ? for (int i = 1; i <= n; ++i) {
? ? ? ? ? ? if (p[i - 1] == '*') dp[0][i] = dp[0][i - 1];
? ? ? ? }
? ? ? ? for (int i = 1; i <= m; ++i) {
? ? ? ? ? ? for (int j = 1; j <= n; ++j) {
? ? ? ? ? ? ? ? if (p[j - 1] == '*') {
? ? ? ? ? ? ? ? ? ? dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return dp[m][n];
? ? }
};

方法三:遞歸解法、剪枝


其實(shí)這道題也可以使用遞歸來(lái)做,因?yàn)樽哟蛘咦訑?shù)組這種形式,天然適合利用遞歸來(lái)做。但是愣了吧唧的遞歸跟暴力搜索并沒(méi)有啥太大的區(qū)別,很容易被 OJ 斃掉 ,參見(jiàn)代碼一:,有以下逐步優(yōu)化的思路:

首先判斷s串,若為空,那么再看p串,若p為空,則為 true,或者跳過(guò)星號(hào),繼續(xù)調(diào)用遞歸。若s串不為空,且p串為空,則直接 false。若s串和p串均不為空,進(jìn)行第一個(gè)字符的匹配,若相等,或者 p[0] 是問(wèn)號(hào),則跳過(guò)首字符,對(duì)后面的子串調(diào)用遞歸。若 p[0] 是星號(hào),先嘗試跳過(guò)s串的首字符,調(diào)用遞歸,若遞歸返回 true,則當(dāng)前返回 true。否則嘗試跳過(guò)p串的首字符,調(diào)用遞歸,若遞歸返回 true,則當(dāng)前返回 true。但是很不幸,內(nèi)存超出限制了 MLE。做了簡(jiǎn)單的優(yōu)化,跳過(guò)了連續(xù)的星號(hào),但是這次時(shí)間超出了限制 TLE,參見(jiàn)代碼二。思考想是不是取子串 substr() 操作太費(fèi)時(shí)間,且調(diào)用遞歸的適合s串和p串又分別建立了副本,才導(dǎo)致的 TLE。于是想著用坐標(biāo)變量來(lái)代替取子串,并且遞歸函數(shù)調(diào)用的s串和p串都加上引用,但尼瑪還是跪了。參見(jiàn)代碼三
找到一種神奇的剪枝的方法,這種解法的遞歸函數(shù)返回類型不是 bool 型,而是整型,有三種不同的狀態(tài),返回0表示匹配到了s串的末尾,但是未匹配成功;返回1表示未匹配到s串的末尾就失敗了;返回2表示成功匹配。那么只有返回值大于1,才表示成功匹配。至于為何失敗的情況要分類,就是為了進(jìn)行剪枝。在遞歸函數(shù)中,若s串和p串都匹配完成了,返回狀態(tài)2。若s串匹配完成了,但p串但當(dāng)前字符不是星號(hào),返回狀態(tài)0。若s串未匹配完,p串匹配完了,返回狀態(tài)1。若s串和p串均為匹配完,且當(dāng)前字符成功匹配的話,對(duì)下一個(gè)位置調(diào)用遞歸。否則若p串當(dāng)前字符是星號(hào),首先跳過(guò)連續(xù)的星號(hào)。然后分別讓星號(hào)匹配空串,一個(gè)字符,兩個(gè)字符,…,直到匹配完整個(gè)s串,對(duì)每種情況分別調(diào)用遞歸函數(shù),接下來(lái)就是最大的亮點(diǎn)了,也是最有用的剪枝,當(dāng)前返回值為狀態(tài)0或者2的時(shí)候,返回,否則繼續(xù)遍歷。如果僅僅是狀態(tài)2的時(shí)候才返回,會(huì)有大量的重復(fù)計(jì)算,因?yàn)楫?dāng)返回值為狀態(tài)0的時(shí)候,已經(jīng)沒(méi)有繼續(xù)循環(huán)下去的必要了,非常重要的一刀剪枝,參見(jiàn)代碼四如下:
代碼一:

// 超出時(shí)間限制
class Solution {
public:
? ? bool isMatch(string s, string p) {
? ? ? ? if (s.empty()) return p.empty() || (p[0] == '*' && isMatch(s, p.substr(1)));
? ? ? ? if (p.empty()) return false;
? ? ? ? if (s[0] == p[0] || p[0] == '?') return isMatch(s.substr(1), p.substr(1));
? ? ? ? if (p[0] == '*') {
? ? ? ? ? ? if (isMatch(s.substr(1), p)) return true;
? ? ? ? ? ? if (isMatch(s, p.substr(1))) return true;
? ? ? ? }
? ? ? ? return false;
? ? }
};
代碼二:

// 超出時(shí)間限制
class Solution {
public:
? ? bool isMatch(string s, string p) {
? ? ? ? if (s.empty()) return p.empty() || (p[0] == '*' && isMatch(s, p.substr(1)));
? ? ? ? if (p.empty()) return false;
? ? ? ? if (s[0] == p[0] || p[0] == '?') return isMatch(s.substr(1), p.substr(1));
? ? ? ? if (p[0] == '*') {
? ? ? ? ? ? if (isMatch(s.substr(1), p)) return true;
? ? ? ? ? ? int i = 0;
? ? ? ? ? ? while (i < p.size() && p[i] == '*') ++i;
? ? ? ? ? ? if (isMatch(s, p.substr(i))) return true;
? ? ? ? }
? ? ? ? return false;
? ? }
};
代碼三:

// 超出時(shí)間限制
class Solution {
public:
? ? bool isMatch(string s, string p) {
? ? ? ? return helper(s, p, 0, 0);
? ? }
? ? bool helper(string& s, string& p, int i, int j) {
? ? ? ? if (i == s.size()) return j == p.size() || (p[j] == '*' && helper(s, p, i, j + 1));
? ? ? ? if (j == p.size()) return false;
? ? ? ? if (s[i] == p[j] || p[j] == '?') {
? ? ? ? ? ? return helper(s, p, i + 1, j + 1);
? ? ? ? }
? ? ? ? if (p[j] == '*') {
? ? ? ? ? ? if (helper(s, p, i + 1, j)) return true;
? ? ? ? ? ? while (j < p.size() && p[j] == '*') ++j;
? ? ? ? ? ? if (helper(s, p, i, j)) return true;
?
? ? ? ? }
? ? ? ? return false;
? ? }
};
代碼四:

// 執(zhí)行用時(shí) :12 ms, 在所有 C++ 提交中擊敗了86.70%的用戶
// 內(nèi)存消耗 :9.2 MB, 在所有 C++ 提交中擊敗了77.99%的用戶
class Solution {
public:
? ? bool isMatch(string s, string p) {
? ? ? ? return helper(s, p, 0, 0) > 1;
? ? }
? ? int helper(string& s, string& p, int i, int j) {
? ? ? ? if (i == s.size() && j == p.size()) return 2;
? ? ? ? if (i == s.size() && p[j] != '*') return 0;
? ? ? ? if (j == p.size()) return 1;
? ? ? ? if (s[i] == p[j] || p[j] == '?') {
? ? ? ? ? ? return helper(s, p, i + 1, j + 1);
? ? ? ? }
? ? ? ? if (p[j] == '*') {
? ? ? ? ? ? if (j + 1 < p.size() && p[j + 1] == '*') {
? ? ? ? ? ? ? ? return helper(s, p, i, j + 1);
? ? ? ? ? ? }
? ? ? ? ? ? for (int k = 0; k <= (int)s.size() - i; ++k) {
? ? ? ? ? ? ? ? int res = helper(s, p, i + k, j + 1);
? ? ? ? ? ? ? ? if (res == 0 || res == 2) return res;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return 1;
? ? }
};文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-631724.html

到了這里,關(guān)于動(dòng)態(tài)規(guī)劃--通配字符串匹配的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 劍指offer(C++)-JZ48:最長(zhǎng)不含重復(fù)字符的子字符串(算法-動(dòng)態(tài)規(guī)劃)

    劍指offer(C++)-JZ48:最長(zhǎng)不含重復(fù)字符的子字符串(算法-動(dòng)態(tài)規(guī)劃)

    作者:翟天保Steven 版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處 題目描述: 請(qǐng)從字符串中找出一個(gè)最長(zhǎng)的不包含重復(fù)字符的子字符串,計(jì)算該最長(zhǎng)子字符串的長(zhǎng)度。 數(shù)據(jù)范圍: ?s.length≤40000?s.length≤40000 示例: 輸入: 返回值: 說(shuō)明

    2024年02月06日
    瀏覽(22)
  • 【算法】力扣【動(dòng)態(tài)規(guī)劃,LCS】1312. 讓字符串成為回文串的最少插入次數(shù)

    1312. 讓字符串成為回文串的最少插入次數(shù) 本文探討的是力扣(LeetCode)上的第1312題:讓字符串成為回文串的最少插入次數(shù)。這是一道屬于動(dòng)態(tài)規(guī)劃類別下的困難題目,通常以回文串相關(guān)的操作來(lái)衡量算法的優(yōu)化和執(zhí)行效率。 問(wèn)題的核心是給定一個(gè)字符串 s ,你可以在任意位

    2024年01月23日
    瀏覽(30)
  • 【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    【算法|動(dòng)態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過(guò)程,希望對(duì)大家有所幫助 ??希望我們一起努力、成長(zhǎng),共同進(jìn)步。

    2024年02月06日
    瀏覽(21)
  • 【字符串匹配】暴力匹配算法

    【字符串匹配】暴力匹配算法

    ? 暴力匹配算法,也稱為樸素字符串匹配算法,是一種簡(jiǎn)單但不高效的字符串匹配方法。它的原理非常直觀,其主要思想是逐個(gè)字符地比較文本串和模式串,從文本串的每個(gè)可能的起始位置開始,依次檢查是否有匹配的子串。以下是暴力匹配算法的詳細(xì)原理: 1. 一個(gè)字一個(gè)

    2024年02月09日
    瀏覽(29)
  • 【動(dòng)態(tài)規(guī)劃】【字符串】擾亂字符串

    【動(dòng)態(tài)規(guī)劃】【字符串】擾亂字符串

    視頻算法專題 動(dòng)態(tài)規(guī)劃匯總 字符串 使用下面描述的算法可以擾亂字符串 s 得到字符串 t : 如果字符串的長(zhǎng)度為 1 ,算法停止 如果字符串的長(zhǎng)度 1 ,執(zhí)行下述步驟: 在一個(gè)隨機(jī)下標(biāo)處將字符串分割成兩個(gè)非空的子字符串。即,如果已知字符串 s ,則可以將其分成兩個(gè)子字符

    2024年02月03日
    瀏覽(21)
  • 字符串查找匹配算法

    字符串查找匹配算法

    字符串匹配(查找)是字符串的一種基本操作:給定帶匹配查詢的文本串S和目標(biāo)子串T,T也叫做模式串。在文本S中找到一個(gè)和模式T相符的子字符串,并返回該子字符串在文本中的位置。 Brute Force Algorithm,也叫樸素字符串匹配算法,Naive String Matching Algorithm。 基本思路就是將

    2024年02月14日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】數(shù)組和字符串(十四):字符串匹配1:樸素的模式匹配算法(StringMatching)

    【數(shù)據(jù)結(jié)構(gòu)】數(shù)組和字符串(十四):字符串匹配1:樸素的模式匹配算法(StringMatching)

    ??字符串(String)是由零個(gè)或多個(gè)字符(char)順序排列組成的有限序列,簡(jiǎn)稱為串。例如 “good morning”就是由12個(gè)字符構(gòu)成的一個(gè)字符串。一般把字符串記作: S = ′ ′ a 0 a 1 … a n ? 1 ′ ′ S=\\\'\\\'a_{0} a_{1}…a_{n-1}\\\'\\\' S = ′′ a 0 ? a 1 ? … a n ? 1 ′′ ? ??其中S是串名,引號(hào)中

    2024年02月05日
    瀏覽(41)
  • 【kmp算法】字符串匹配

    kmp算法解決的是字符串匹配的問(wèn)題,具體來(lái)說(shuō)假定我們要在主串s[ ] 中匹配模式串p[ ],找到匹配到的位置loc; 最自然的想法是暴力寫法 (BF)枚舉主串字符s[ i ] ,和模式串p[ j ]。一個(gè)一個(gè)匹配,如果匹配失敗,i指針回退回起點(diǎn),往前進(jìn)一位,再次進(jìn)行比較,知道匹配成功。

    2024年02月04日
    瀏覽(31)
  • 字符串匹配-KMP算法

    字符串匹配-KMP算法

    KMP算法,字符串匹配算法,給定一個(gè)主串S,和一個(gè)字串T,返回字串T與之S匹配的數(shù)組下標(biāo)。 在學(xué)KMP算法之前,對(duì)于兩個(gè)字符串,主串S,和字串T,我們根據(jù)暴力匹配,定義兩個(gè)指針,i指向主串S的起始,j指向字串T的起始,依次比較,如果 主串i位置的值等于子串j位置的值,

    2024年02月14日
    瀏覽(28)
  • 字符串匹配算法:KMP

    字符串匹配算法:KMP

    Knuth–Morris–Pratt(KMP)是由三位數(shù)學(xué)家克努斯、莫里斯、普拉特同時(shí)發(fā)現(xiàn),所有人們用三個(gè)人的名字來(lái)稱呼這種算法,KMP是一種改進(jìn)的字符串匹配算法,它的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達(dá)到快速匹配的目的。它的時(shí)間復(fù)雜度是 O(m+n) 字

    2024年02月06日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包