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...