1. 程式人生 > 實用技巧 >44. 萬用字元匹配

44. 萬用字元匹配

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

'?' 可以匹配任何單個字元。
'*' 可以匹配任意字串(包括空字串)。
兩個字串完全匹配才算匹配成功。

說明:

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

輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字串。
示例2:

輸入:
s = "aa"
p = "*"
輸出: true
解釋:'*' 可以匹配任意字串。
示例3:

輸入:
s = "cb"
p = "?a"
輸出: false
解釋:'?' 可以匹配 'c', 但第二個 'a' 無法匹配 'b'。

示例4:

輸入:
s = "adceb"
p = "*a*b"
輸出: true
解釋:第一個 '*' 可以匹配空字串, 第二個 '*' 可以匹配字串 "dce".
示例5:

輸入:
s = "acdcb"
p = "a*c?b"
輸出: false

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/wildcard-matching
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路:雙指標 模式串的指標 j 始終指向待匹配的

 public static  boolean isMatch(String s, String p) {
        
int i=0; int j=0; int starPos=-1; //*號位置 int match=-1; //匹配*用 while(i<s.length()) { //當前兩個字元是否相同 if(j<p.length()&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='?')) { i++; j++; } //匹配到星號
else if(j<p.length()&&p.charAt(j)=='*') { match = i; starPos = j; j=starPos+1; } //星號沒有匹配成功 else if(starPos!=-1) { match++; i=match; j=starPos+1; } else return false; } //abcd //a*d* while(j<p.length()&&p.charAt(j)=='*') { j++; } return j==p.length(); }