之前做虾皮的笔试题时好像有个正则匹配的题目,当时没ac,后面有事情也没想起来要找答案,今天特来还债。
解析:题目中有个关键字符※(打不出来星号,就用这个代替吧),判断两个字符串是否匹配※位置至关重要。其实也是一种边界问题,有好多种情况需要考虑,考虑用递归来解这个问题。
根据※号的位置可以划分成两种大的情况。假设目标串为str,匹配串为pattern。
情况①:pattern[1]!=※,此时有两种情况。
1.str…charAt(0)==pattern.charAt(0),str与pattern均向后移动一位,继续match
2.str.charAt(0)!=pattern.charAt(0),直接返回false
情况②:pattern.charAt(1) == ※,此时分为三种情况。
1.假如str.charAt(0)‘b’,pattern.charAt(0) == ‘a’,pattern.charAt(1) ※,str不动,pattern后移两位
2.假如str=={“ab”+…},pattern=={’‘a*b’’+…};str后移一位,pattern移动两位
3.假如str=={“aaaab”+…},pattern=={“a※b”},str持续后移,pattern不变,直到str.charAt(i)!=str.charAt(i+1)
代码如下:
import java.util.*;
import java.lang.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
public boolean match (String str, String pattern) {
// 为了操作方便,我把字符串转换成了字符数组
char[]strToChrs = str.toCharArray();
char[]patToChrs = pattern.toCharArray();
if(strToChrs==null||patToChrs==null){//递归出口1
return false;
}
if(strToChrs.length==1){//递归出口2
if(patToChrs.length==1){
if(strToChrs[0]==patToChrs[0]||patToChrs[0]=='.'){
return true;
}
return false;
}
}
int sindex=0,pindex=0;
return matchIndex(strToChrs,sindex,patToChrs,pindex);
}
public boolean matchIndex(char[] str,int sindex,char[] pattern,int pindex){
if(sindex==str.length&&pindex==pattern.length){
return true;
}
if(sindex!=str.length&&pindex==pattern.length){
return false;
}
if(pindex+1<pattern.length&&pattern[pindex+1]=='*'){//pattern[1]=='*'
if((sindex!=str.length&&pattern[pindex]==str[sindex])||
(sindex!=str.length&&pattern[pindex]=='.')){
return matchIndex(str,sindex+1,pattern,pindex+2)
||matchIndex(str,sindex,pattern,pindex+2)
||matchIndex(str,sindex+1,pattern,pindex);
}else{
return matchIndex(str,sindex,pattern,pindex+2);
}
}
if(sindex!=str.length&&pattern[pindex]==str[sindex]||sindex!=str.length
&&pattern[pindex]=='.'){//pattern[1]!='*'
return matchIndex(str,sindex+1,pattern,pindex+1);
}
return false;
}
}