剑指offer系列26--正则表达式匹配
Posted noaman_wgs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer系列26--正则表达式匹配相关的知识,希望对你有一定的参考价值。
【题目】请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”aba”均不匹配
1 package com.exe6.offer; 2 /** 3 * 【题目】请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符, 4 * 而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。 5 * 例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”aba”均不匹配 6 * @author WGS 7 * 8 */ 9 public class MatchRegString { 10 11 public boolean match(char[] str,char[] pattern){ 12 if(str==null ||pattern==null) 13 return false; 14 return matchCore(str,0,str.length,pattern,0,pattern.length); 15 } 16 17 public boolean matchCore(char[] str, int i, int length1, char[] pattern, int j, int length2) { 18 if(i==length1 && j==length2){ 19 return true; 20 /*if(j==length2 || pattern[j]==‘*‘){ 21 return true; 22 }else{ 23 return false; 24 }*/ 25 } 26 if(i!=length1 && j==length2){ 27 return false; 28 } 29 //3 当pattern中下一个字符有‘*‘时 30 if(j+1<length2 && pattern[j+1]==‘*‘){ 31 //① a A a与a A * a 即*前值与str中要比较的值相同 32 // a A a与a . * a 33 if(str[i]==pattern[j]){ 34 //后移两位 35 return matchCore(str,i+1,length1,pattern,j+2,length2) 36 //在原状态 37 || matchCore(str,i+1,length1,pattern,j,length2) 38 //忽略 39 || matchCore(str,i+1,length1,pattern,j+2,length2); 40 } 41 //②a A a与a B * a 即*前值与str中要比较的值不同 pattern就忽略*前的值,后移两位继续比较,str 值不变 42 else{ 43 return matchCore(str,i,length1,pattern,j+2,length2); 44 } 45 } 46 47 //1 2 当前字符匹配或者匹配‘.‘ 两者均右移一位继续比较; 48 if(i<length1 && (str[i]==pattern[j] || pattern[j]==‘.‘)){ 49 return matchCore(str,i+1,length1,pattern,j+1,length2); 50 } 51 return false; 52 } 53 54 public static void main(String[] args) { 55 char[] str=new char[]{‘a‘, ‘a‘, ‘a‘}; 56 char[] pattern=new char[]{‘a‘, ‘b‘,‘*‘,‘a‘, ‘c‘,‘*‘,‘a‘}; 57 MatchRegString m=new MatchRegString(); 58 boolean b=m.match(str, pattern); 59 System.out.println(b); 60 61 } 62 63 }
以上是关于剑指offer系列26--正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章