小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:字符串
数据结构类算法总结:字符串
1.题目描述:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符, 而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中, 匹配是指字符串的所有字符匹配整个模式。 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
2.代码实现:
public class Solution19 { public static void main(String[] args) { Solution19 s = new Solution19(); String str = "aaa"; String pat = "ab*ac*a"; char[] ctr = str.toCharArray(); char[] cat = pat.toCharArray(); boolean b = s.match(ctr,cat); System.out.println(b); } public boolean match(char[] str,char[] pattern){ return matchCore(str,0,str.length,pattern,0,pattern.length); } public boolean matchCore(char[] str,int i,int length1, char[] pattern,int j,int length2){ //1.最终结束条件:目标串和模式串都扫描到结尾 if(i==length1 && j==length2) return true; //2.目标串到达结尾&&模式串未达到结尾 if(i==length1 && j!=length2){ while(j!=length2){ if(pattern[j]!='*'&&(j+1>=length2||pattern[j+1]!='*')){ return false; } j++; } return true; } //3.目标串未达到结尾&&模式串已到达结尾 if(i!=length1 && j==length2) return false; //4.模式串+1到达结尾 if(j+1==length2){ if(str[i] == pattern[j] || pattern[j] == '.'){ return matchCore(str,i+1,str.length,pattern,j+1,pattern.length); }else{ return false; } } //5.模式串匹配 模式串下一个位置不为* if((str[i] == pattern[j] || pattern[j] == '.')&& pattern[j+1] != '*'){ return matchCore(str,i+1,str.length,pattern,j+1,pattern.length); } //6.模式串匹配 模式串下一个位置为* if((str[i] == pattern[j] || pattern[j] == '.')&& pattern[j+1] == '*'){ return matchCore(str,i,str.length,pattern,j+2,pattern.length) || matchCore(str,i+1,str.length,pattern,j,pattern.length); } //7.模式串+1 结尾为* if(pattern[j+1] == '*'){ return matchCore(str,i,str.length,pattern,j+2,pattern.length); } return false; } }