题解 | #字符串通配符#
字符串通配符
http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
想了老半天的办法,最后时间复杂度排名是第一 let a = readline().toLowerCase() let b = readline().toLowerCase() function isMatch(a,b){ if(a.length === 0){ return true } let i = 0 for(let j =0;j<b.length;j++){ if(a[i] === b[j]){ // print(i,j,'相等') i++
}else if(a[i] === '?'){
if(/[a-z0-9]/.test(b[j])){
i++
}else{
return false
}
}else if(a[i] === '*'){
// 需要解决*什么时候匹配 什么时候不匹配 不能简单以为下一个字符能相等就不匹配了
// 要结合后面的字符能不能匹配到 后面的字符能不能匹配? 可以继续调用这个方法
// 假设后面的字符全部能匹配上 那么此处*不匹配
// 假设后面的字符不能匹配上 不能先选择 否则时间太长 应该直接从字符串尾部开始匹配
// 找到第一个尾部可以匹配上的字符串 直接把这个地方的j赋值给j let c = a.substr(i+1) if( c.length > 0 && c[c.length -1] !== b[b.length -1] && c[c.length -1] !=='*' && c[c.length -1] !=='?'){ return false } for(let k = b.length -1;k >= j;k--){ let d = b.substr(k) if(isMatch(c,d)){ return true } } return false }else{ return false } } if(i < a.length){ return false }else{ return true }
}
print(isMatch(a,b))