剑指 offer之正则表达式匹配_Java

题目:正则表达式匹配

题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

解题思路:
ps: 来自剑指 offer评论区
当模式中的第二个字符不是“*”时:
1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。

而当模式中的第二个字符是“”时:
如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式:
1、模式后移2字符,相当于x
被忽略;
2、字符串后移1字符,模式后移2字符;
3、字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;
这里需要注意的是:Java里,要时刻检验数组是否越界。

代码实现:


public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        if (str == null || pattern == null) {
				return false;
			}
			return match(str, 0, pattern, 0);

		}

		private boolean match(char[] str, int startS, char[] pattern, int startP) {

			// 两个都走到头了
			if (startS == str.length && startP == pattern.length) {
				return true;
			}
			if (startS != str.length && startP == pattern.length) {
				// pattern走到头了,但是str没有走到头
				return false;
			}
			// 都没有走到头
			// 如果pattern[startP+1]是个*
			if (startP + 1 < pattern.length && pattern[startP + 1] == '*') {
				// 如果此时这个单词匹配上那个模式里面的,0次,1次,或者多次
				if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
					return match(str, startS, pattern, startP + 2) || match(str, startS + 1, pattern, startP + 2)
							|| match(str, startS + 1, pattern, startP);
				} else {
					// 没有匹配上,模式向后走两步
					return match(str, startS, pattern, startP + 2);
				}
			}
			// 匹配那个点
			if (startS != str.length && (str[startS] == pattern[startP] || pattern[startP] == '.')) {
				// 都往后走一步
				return match(str, startS + 1, pattern, startP + 1);
			} else {
				return false;
			}
		}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章