劍指Offer題目:正則表達式匹配
題目描述
請實現一個函數用來匹配包括'.'
和'*'
的正則表達式。模式中的字符'.'
表示任意一個字符,而'*'
表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配
解題思路
使用遞歸的思想
每一步遞歸中都判斷模式的第2位字符是不是‘*’
-
是‘*’,繼續判斷字符當前位和模式當前位是否相等(包含模式位爲‘.’的情況)
1.1 相等
1.1.1 字符串下標不變,模式下標+2,代表匹配0次
1.1.2 字符串下標+1,模式下標+2,代表匹配1次
1.1.3 字符串下標+1,模式下標不變,代表匹配多次1.2 不相等則只有一種處理辦法:字符串下標不變,模式下標+2
-
不是‘*’,繼續判斷字符當前位和模式當前位是否相等(包含模式位爲‘.’的情況)
2.1 不相等:直接返回false
2.2 相等:則字符串下標+1,模式下標+1
終止條件:
- 字符串還沒遍歷完,模式已遍歷完,則返回false;
- 字符串和模式一起遍歷完,則返回true;
完整代碼
public class q53_match_正則表達式匹配 {
private int slen;
private int plen;
public boolean match(char[] str, char[] pattern) {
if ((str == null || str.length == 0) && (pattern == null && pattern.length == 0)) return true;
this.slen = str.length;
this.plen = pattern.length;
return trace(str, 0, pattern, 0);
}
private boolean trace(char[] str, int sindex, char[] pattern, int pindex) {
if (sindex == slen && pindex >= plen) return true;
if (sindex < slen && pindex >= plen) return false;
if (pindex + 1 < plen && pattern[pindex + 1] == '*') {
//第二位字符是'*'
if (sindex < slen && (str[sindex] == pattern[pindex] || pattern[pindex] == '.')) {
return trace(str, sindex + 1, pattern, pindex + 2) || trace(str, sindex + 1, pattern, pindex)
|| trace(str, sindex, pattern, pindex + 2);
} else
return trace(str, sindex, pattern, pindex + 2);
} else {
//第二位字符不是'*'
if (sindex < slen && (str[sindex] == pattern[pindex] || pattern[pindex] == '.'))
return trace(str, sindex + 1, pattern, pindex + 1);
else
return false;
}
}
}
更多LeetCode題目及答案解析見GitHub: https://github.com/on-the-roads/LeetCode
劍指offer題目及答案解析:https://github.com/on-the-roads/SwordToOffer