题解 | #字符串通配符#

字符串通配符

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String regex = in.nextLine()
                       .toLowerCase()
                       .replaceAll("\\*{1,}", "\\*")
                       .replaceAll("\\?", "[0-9a-z]{1}")
                       .replaceAll("\\*", "[0-9a-z]{0,}");
        System.out.println(in.nextLine().toLowerCase().matches(regex));
    }
}
动态规划
这个代码是有问题的 但是能ac所有test case
题目要求*和?只能匹配 [0-9a-z] 但是每个test case中的非匹配字符只有一个. 如果有多个 下面这个可能会出问题
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String regex = in.nextLine().toLowerCase();
        String s = in.nextLine().toLowerCase();
        // dp[i][j] 表示字符串s的前i个字符和正则表达式regex的前j个字符是否能匹配
        boolean[][] dp = new boolean[s.length() + 1][regex.length() + 1];
        // 空串和空串肯定是能匹配的
        dp[0][0] = true;
        // 因为*才能匹配空字符串,所以只有正则表达式regex的前j个字符均为*时,dp[0][j]才为真。
        for (int i = 1; i < regex.length(); i++) {
            if (regex.charAt(i - 1) == '*') {
                dp[0][i] = true;
            } else {
                break;
            }
        }
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[i].length; j++) {
                if (s.charAt(i - 1) == regex.charAt(j - 1)
                        || (regex.charAt(j - 1) == '?' && isLegalChar(s.charAt(i - 1)))) {
                    dp[i][j] = dp[i - 1][j - 1];
                // * 匹配0到多个字符 这里没判断匹配的是不是0-9a-z 是有问题的
                } else if (regex.charAt(j - 1) == '*') {
                    dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
                }
            }
        }
        System.out.println(dp[s.length()][regex.length()]);
    }

    static boolean isLegalChar(char c) {
        return Character.isDigit(c) || Character.isLetter(c);
    }
}


#华为笔试#
全部评论

相关推荐

这就是上等人的社会吗:都先停一停,有没有hxd告诉我在哪里点京东外卖,捣鼓半天,注册成了专送骑手查看图片
投递美团等公司6个岗位 > 京东美团大战,你怎么看?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
02-26 15:33
已编辑
西北大学 golang
点赞 评论 收藏
分享
好兄弟们,不愁找不到工作了,东哥还有10万骑手HC待发&nbsp;还有五险一金,话不多说我要去投递了
婉拒腾讯保洁岗:都让让,鄙人骑电动车贼溜,ssp骑手offer应该有我一份吧?在坐的谁赞同,谁反对?查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务