题解 | #字符串通配符#

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

  • 使用动态规划解决
  • d[i][j]表示模式t[0:i]与字符串s[0:j]是否能够匹配
  • 当t[i]='*'时,如果t[0:i-1]与s[0:j]匹配或者t[0:i]和s[0:j-1]匹配则必有t[0:i]与字符串s[0:j]匹配
  • 当t[i]与s[j]字符匹配时,并且t[0:i-1]与s[0:j-1]匹配,则必有t[0:i]与字符串s[0:j]匹配
  • 综上所述可以得到递推式
  • 另外求解动态规划的边界条件
/**
 动态规划
 dp[i][j] 表示t[i] s[j]是不是能够匹配到
 dp[0][0] 看下t[0] s[0]能不能匹配到
 dp[i][j] = dp[i][j-1] || dp[i-1][j] ,如果t[i]='*' || dp[i-1][j-1],如果t[i],s[j]能够匹配 || dp[i-1][j] 如果t[i]==*
*/

import java.util.*;

public class Main{
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String t = sc.nextLine();
            String s = sc.nextLine();
            System.out.println(match(t,s));
        }
    }
    
    
    public static boolean match(String t, String s){
        int lt = t.length(), ls = s.length();
        boolean[][] dp = new boolean[lt][ls];
        //确定动态规划的边界
        //dp[0][i];
        for(int i = 0; i < ls; i++){
            if(i == 0){
                dp[0][0] = matchChar(t.charAt(0),s.charAt(0));
            }else{
                dp[0][i] = dp[0][i-1] && matchChar(t.charAt(0),s.charAt(i)) && t.charAt(0) == '*';
            }
        }
        //dp[i][0]
        boolean allStar = t.charAt(0) == '*';
        for(int i = 1; i < lt; i++){
            dp[i][0] = (dp[i-1][0] && t.charAt(i) == '*') || (allStar && matchChar(t.charAt(i),s.charAt(0)));
            if(t.charAt(i) != '*'){
                allStar = false;
            }
        }
        // 先覆盖t的维度 确定的s,遍历t
        for(int i = 1; i < lt; i++){
            for(int j = 1; j < ls; j++){
                dp[i][j] = (t.charAt(i) == '*' && (dp[i-1][j] || dp[i][j-1])) || (dp[i-1][j-1] && matchChar(t.charAt(i), s.charAt(j)));
            }
        }
        return dp[lt - 1][ls - 1];
    }
    
    public static boolean matchChar(char t, char s){
        if(Character.isLetter(t) && Character.isLetter(s) && (Character.toLowerCase(t) == Character.toLowerCase(s))){
            return true;
        }
        if((t == '*' || t == '?') && (Character.isDigit(s) || Character.isLetter(s))){
            return true;
        }
        //其他字符
        if(t == s){
            return true;
        }
        return false;
    }
}
全部评论

相关推荐

积极的小学生不要香菜:你才沟通多少,没500不要说难
点赞 评论 收藏
分享
来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务