气炸了,同事拿着我的项目去面试,结果跳槽直接涨薪50%!
算法题:通配符匹配
s,一个是模式字符串 p。其中,p 可以包含两种通配符:•
?:匹配任意单个字符;•
*:匹配任意数量(包括0个)字符。
p 是否可以匹配整个 s。Pattern.matches(p, s)。结果发现,不能直接拿通配符当正则用,因为 * 在正则里是“重复前面的字符”,不是“匹配任意字符”。😵public boolean isMatch(String s, String p) {int sLen = s.length(), pLen = p.length();int sIdx = 0, pIdx = 0;int starIdx = -1, match = 0;while (sIdx < sLen) {if (pIdx < pLen && (p.charAt(pIdx) == '?' || p.charAt(pIdx) == s.charAt(sIdx))) {// 字符匹配成功,两个指针都走sIdx++;pIdx++;} else if (pIdx < pLen && p.charAt(pIdx) == '*') {// 遇到星号,记录位置,并试图匹配0个字符starIdx = pIdx;match = sIdx;pIdx++;} else if (starIdx != -1) {// 如果之前有星号,就尝试让星号多匹配一个字符pIdx = starIdx + 1;match++;sIdx = match;} else {// 无法匹配return false;}}// 检查后续的星号while (pIdx < pLen && p.charAt(pIdx) == '*') {pIdx++;}return pIdx == pLen;}
1. 如果字符一样或者是
?,那毫无疑问,两个指针都往前走;2. 如果遇到
*,那是个分水岭,我们得记下当前的星号位置,和当前s的位置;3. 如果匹配不上了,但我们之前记录了
*,那就强行回溯,让*吃掉一个字符,接着往后试;4. 没星号,又匹配不了,那就没救了,return false。
• 星号虽然万能,但它必须要靠前后文兜底,不然容易翻车;
•
?就像感情里那种看起来靠谱的人,其实只适合短暂靠一下,长期不行。
/api/*/user/?,这种匹配规则你用这个逻辑包装一下,能跑得飞起。最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
-END-
以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。