字串匹配

2021-10-07 19:35:54 字數 2329 閱讀 8499

1、leetcode44、萬用字元匹配

給定乙個字串 (s) 和乙個字元模式 (p) ,實現乙個支援 '?' 和 '*' 的萬用字元匹配。

'?' 可以匹配任何單個字元。

'*' 可以匹配任意字串(包括空字串)。

兩個字串完全匹配才算匹配成功。

說明:s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母,以及字元 ? 和 *。

輸入:s =

"aa"

p ="a"

輸出:false

解釋:"a" 無法匹配 "aa" 整個字串。

輸入:s =

"aa"

p ="*"

輸出:true

解釋:'*' 可以匹配任意字串。

輸入:s =

"cb"

p ="?a"

輸出:false

解釋:'?' 可以匹配 'c'

, 但第二個 'a' 無法匹配 'b'。

思路:

1、狀態定義:

dp[i][j] 表示 p 的前 i 個字元和 s 的前 j 個字元是否匹配。

2、狀態轉移:

如果 p[i - 1] == s[j - 1] 或 p[i - 1] == 『?』,表示當前的字串是匹配的,dp[i][j] 可以從 dp[i - 1][j - 1] 轉移而來。

如果 p[i - 1] == 『*』,這個位置可以匹配 0 到 若干個字元。那麼 dp[i][j] 可以從 dp[i - 1][j] 轉移而來(表示當前星號沒有匹配字元),也可以從 dp[i][j - 1] 轉移而來(表示當前星號匹配了當前的位置的字元)。因為只要任意一種匹配即可,所以這裡是邏輯或的關係。

狀態轉移方程如下:

當模式串字元為時,兩種情況:

// 匹配空字串,這樣的話直接匹配dp[i][j-1],表示不算看模式能否和字串匹配。

// 匹配多次,等於直接忽略了字串的第i位,因為它可以被匹配,同時不會「損耗」掉匹配串的dp[i-1][j]。

public

boolean

ismatch

(string s, string p)

else

}for

(int i=

1;i<=s.

length()

;i++

)else

if(p.

charat

(j -1)

=='?'

|| s.

charat

(i -1)

== p.

charat

(j -1)

)}}return dp[s.

length()

][p.

length()];}

leetcode10、正規表示式匹配

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 '.' 和 '*' 的正規表示式匹配。

'.' 匹配任意單個字元

'*' 匹配零個或多個前面的那乙個元素

所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。

說明:s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母,以及字元 . 和 *。

匹配有以下情況:兩個字元相等或者p的字元等於.則返回當前字元之前的狀態。主要是『』的狀態有點複雜。當模式中的第二個字元是「」時:

如果字串第乙個字元跟模式第乙個字元不匹配,則模式後移2個字元,繼續匹配。如果字串第乙個字元跟模式第乙個字元匹配,可以有3種匹配方式:

1.模式後移2字元,相當於x被忽略;

2.字串後移1字元,模式後移2字元,相當於x匹配一位;

3.字串後移1字元,模式不變,即繼續匹配字元下一位,相當於x*匹配多位;

public

boolean

ismatch

(string s, string p)

}for

(int i=

1;i<=s.

length()

;i++)if

(p.charat

(j)==

'*')

else}}

}return dp[s.

length()

][p.

length()];}

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...

字串匹配

time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...

字串匹配

面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...