考虑正则表达式的匹配.....最初使用了一个递归的算法,但是在解决*的时候没有很好的处理(对于pattern中的每个*都遍历了所有情况),因而超时。
看了下解答,其实我们只需要维护pattern中遍历到的最近的*的位置starIdx和其匹配到的str中的位置matchIdx即可,另外用sts和stp分别记录str和pattern的遍历进度。当出现无法匹配的情况,回溯到最近的*得状态,更新matchIdx再次遍历即可。 这样我们始终只用考虑单层的回溯即可。
public class Solution {
public boolean isMatch(String s, String p) {
int lenS=s.length(),lenP=p.length();
int sts=0,stp=0,starIdx=-1,matchIdx=0;
while( sts<lenS )
{
if( stp<lenP&&( p.charAt(stp)=='?'||p.charAt(stp)==s.charAt(sts) ) )
{
stp++;
sts++;
}
else if( stp<lenP&&p.charAt(stp)=='*' )
{
starIdx=stp;
matchIdx=sts;
stp++;
}
else if( starIdx!=-1 )
{
stp=starIdx;
matchIdx++;
sts=matchIdx;
stp++;
}
else
{
return false;
}
}
while( stp<lenP&&p.charAt(stp)=='*' )
{
stp++;
}
return stp==lenP;
}
}