Leetcode44:通配符匹配(附視頻解析)

題目描述(建議背下來)

給定一個字符串(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

代碼實現(建議背下來)

public static boolean isMatch(String s,String p) {
		int sp=0;//定義s的位置爲0
		int pp=0;//定義p的位置爲0
		int match=0;
		int star=-1;//star表示*出現的位置
		while (sp<s.length()) {
			if (pp<p.length()&&(s.charAt(sp)==p.charAt(pp)||p.charAt(pp)=='?')) {
				//當s和p的當前位置可以匹配或者p的當前位置是?時,向後移動一步
				sp++;
				pp++;
			}else if (pp<p.length()&&p.charAt(pp)=='*') {
				star=pp;//記錄當前*的位置
				match=sp;//記錄當前s字符串的匹配位置
				pp++;
			}else if (star!=-1) {
				pp=star+1;
				match++;
				sp=match;
			}else {
				return false;
			}
		}
		//上面的while循環之後sp一定走到了頭,但是pp不一定走到了頭
		while (pp<p.length()&&p.charAt(pp)=='*') {
			pp++;
		}
		return pp==p.length();
	}

視頻講解

通配符匹配(B站講解)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章