10.正則表達(dá)式匹配
要求:給定一個字符串 (s) 和一個字符模式 (p)。實現(xiàn)支持 '.' 和 '*' 的正則表達(dá)式匹配。
- '.' 匹配任意單個字符。
- '*' 匹配零個或多個前面的元素
示例:
輸入:
s = "mississippi"
p = "mis*is*p*."
輸出: false
代碼思路: 遍歷模式串,查詢s串是否能與p串匹配上。
public boolean isMatch(String s, String p) {
//兩串的長度
int sLen = s.length();
int pLen = p.length();
//s串的當(dāng)前檢索位置,(這里通過s串是否滿足p串作匹配)。
int currentIndex = 0;
//遍歷p串
for (int i = 0; i < pLen; i++) {
char c = p.charAt(i);
//.號
if (c == '.') {
//后一個是 "*"
if (i + 1 < pLen && p.charAt(i + 1) == '*') {
//不做處理,交由后面*字符處理
}
//匹配任意
else {
if (currentIndex < sLen) {
//任意匹配
currentIndex++;
} else {
//匹配失敗
return false;
}
}
}
//匹配“*”
else if (c == '*') {
if (i - 1 >= 0) {
//獲取前一個字符
char last = p.charAt(i - 1);
//一個都沒有就跳過及匹配0個last字符
if (currentIndex < sLen && s.charAt(currentIndex) != last && last!='.') {
//繼續(xù)匹配,不做處理
} else {
if (i + 1 < pLen) {
//"*"后面還有字符
String temp_p = p.substring(i + 1);
//按照匹配個數(shù)為0,1,2,3的情況下,檢測后面對應(yīng)的兩個字串能后匹配上
for (int j = currentIndex; j <= sLen; j++) {
String temp_s = s.substring(j);
if(j==currentIndex || last=='.' || last==s.charAt(j-1)){
if (isMatch(temp_s, temp_p)) {
return true;
}
}
else{
break;
}
}
return false;
} else {
//“*”后面沒有字符
//前一個是"."
if(last=='.'){
//可以任意匹配,匹配總是成功
return true;
}
//前一個是其他,逐個匹配
while(currentIndex<sLen && s.charAt(currentIndex)==last){
currentIndex++;
}
}
}
}
} else {
//普通字符
if (i + 1 < pLen && p.charAt(i + 1) == '*') {
//后面是*,交由后面處理
continue;
}
//普通匹配
if (currentIndex < sLen && c == s.charAt(currentIndex)) {
currentIndex++;
} else {
//匹配失敗
return false;
}
}
}
//成功匹配
if (currentIndex >= sLen) {
return true;
}
//匹配失敗
else {
return false;
}
}