面试题16.18.模式匹配
回溯
代码
/**
* 回溯算法
* 95ms
*
*/
public boolean patternMatching(String pattern,String value){
String s[]=new String[2];
return solve(s,pattern,0,value,0);
}
/**
*
* @param s s[0]为a对应的字符串 s[1]为b对应的字符串
* @param pattern 模式串
* @param index1 模式串匹配位置
* @param value 匹配串
* @param index2 匹配串匹配的位置
* @return
*/
private boolean solve(String[] s, String pattern, int index1, String value, int index2) {
//匹配完成
if(index1==pattern.length()&&index2==value.length()) return true;
//当匹配串匹配位置等于 匹配串长度的时候 也可以继续匹配,因为模式匹配中的a,b可以匹配空串
if(index1>=pattern.length()||index2>value.length()) return false;
int num=pattern.charAt(index1)-'a';
if(s[num]==null){
//从当前尝试a或b对应的字符串的每一种可能
for(int i=index2;i<=value.length();i++){
s[num]=value.substring(index2, i);
if(!s[num].equals(s[num^1])&&solve(s,pattern,index1+1,value,i)) return true;
}
//失配时应将设置过的对应字符串为空
s[num]=null;
return false;
}else{
//若此前a或b已有对应的字符串匹配成功了,则查看当前位置时候能否匹配上
int end=index2+s[num].length();
if(end>value.length()||!value.substring(index2, end).equals(s[num])) return false;
return solve(s, pattern, index1+1, value, end);
}
}
参考链接