牛客网 字符串通配符

简介: 牛客网 字符串通配符

做题链接:字符串通配符__牛客网 (nowcoder.com)

要求:实现如下2个通配符(不区分大小写):


*   :匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)

? :匹配1个字符

输入:通配符表达式;一组字符串。


输出:返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false


数据范围:字符串长度:1≤s≤100 1\le s\le 100\ 1≤s≤100


示例:


pq
pppq
false
**Z
0QZz
true
?*Bc*?
abcd
true
h*?*a
h#a
false
p*p*qp**pq*p**p***ppq
pppppppqppqqppqppppqqqppqppqpqqqppqpqpppqpppqpqqqpqqp
false


做题思路 : dp 问题   使用二维数组解决问题

假设两个字符串分别是   ABCD      * BC * ?   ,那么我们就可以画出如下图

1. 为什么多一行为 null?    ---->  因为字符串可能为空  其实这就是一点一点匹配的过程


8ce89b7b7c8a4633aef57b1e3d3ae4ef.png

 2. 先填充为 null 的部分


a8e757ad4c664caba68d4330dc194879.png

3. 匹配剩余地方


我们可以根据 横轴的字母来分类判断是否为 T


 *   :左边 || 上面 || 左上角

 ?  :  当前位置可以匹配     且左上角为 T  就为 T

 字母/数字:当前位置可以匹配,左上角 为 T 就为 T

得到下图 ,我们可以看到最后一个 为 T  那么也就代表  这两个字符串可以匹配。


3e11878e92304137bb95e8fa50fc0a88.png


最终代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine().toLowerCase();//带通配符的字符串
        String str2 = scanner.nextLine().toLowerCase();//不带通配符的字符串
        boolean ret = isMatching(str1, str2);
        System.out.println(ret);
    }
        public static boolean isMatching(String s1, String s2) {
        boolean[][] arr = new boolean[s2.length() + 1][s1.length() + 1];
        //我们使用 0 代表 false   1 代表 true
        //1.首先把第一行和第一列搞定
        //    第一行:
        arr[0][0] = true;
        for (int i = 1; i <= s1.length(); i++) {
            char ch = s1.charAt(i - 1);
            if (ch == '*') {
                arr[0][i] = arr[0][i - 1];
            } else {
                arr[0][i] = false;
            }
        }
        //    第一列
        for (int i = 1; i <= s2.length(); i++) {
            char ch = s2.charAt(i - 1);
            if (ch == '*') {
                arr[i][0] = arr[i - 1][0];
            } else {
                arr[i][0] = false;
            }
        }
        //2.填充其他部分
        for (int i = 1; i <= s2.length(); i++) {
            for (int j = 1; j <= s1.length(); j++) {
                char ch = s1.charAt(j - 1);
                //①判断是*的情况
                if (ch == '*' && isOk(s2.charAt(i - 1))){
                    arr[i][j] = arr[i - 1][j] || arr[i][j - 1] || arr[i-1][j-1];
                }
                //②判断是 ? 的情况
                else if (ch == '?' && isOk(s2.charAt(i - 1))) {
                    arr[i][j] = arr[i - 1][j - 1];
                }
                //③不是通配符的情况
                else{
                    if (ch == s2.charAt(i - 1) && arr[i - 1][j - 1]) {
                        arr[i][j] = true;
                    } else {
                        arr[i][j] = false;
                    }
                }
            }
        }
        return arr[s2.length()][s1.length()];
    }
    public static boolean isOk(char ch) {
        return ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z';
    }
}


相关文章
|
Java Linux
使用jps强制关闭java进程
使用jps强制关闭java进程
1416 0
使用jps强制关闭java进程
|
安全 网络安全 数据安全/隐私保护
ssl证书认证失败的原因和解决办法
ssl证书认证失败的原因和解决办法
|
JSON Java API
Java快递单号查询接口怎么接入物流API
Java怎么写物流接口,怎么接入物流接口,如何根据单号查询物流跟踪的详细信息 需求 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能 demo实例 本人自己运行过的Demo —> 点我下载 应用场景(下图) 实现步骤 4.
10787 1
|
8月前
|
安全 虚拟化 iOS开发
VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版
VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版
346 42
VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版
|
测试技术 持续交付
软件测试中的自动化测试策略与最佳实践
【10月更文挑战第31天】 在当今快速迭代的软件开发环境中,自动化测试成为确保软件质量和加速产品上市的关键。本文探讨了自动化测试的重要性、实施策略以及一些最佳实践。通过分析不同类型的自动化测试工具和框架,本文旨在为软件开发团队提供一套实用的指导方案,以提高测试效率和质量。
|
移动开发 JavaScript 前端开发
为了学习vue3,安装nvm进行node的多版本管理
为了学习vue3,安装nvm进行node的多版本管理
314 2
|
安全 Java 开发者
深入了解Spring Cloud Security:构建安全的分布式微服务
随着微服务架构的流行,安全性成为了构建分布式系统的关键问题之一。Spring Cloud Security是Spring家族中的一个强大工具,它提供了一系列功能,帮助开发者轻松地保护其微服务应用程序。本文将深入探讨Spring Cloud Security的各个方面,从基本概念到实际应用,帮助您构建安全的分布式微服务。
|
缓存 网络协议 网络架构
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
本文详细介绍了如何使用网络抓包工具Wireshark进行网络抓包分析,包括以太网v2 MAC帧、IP数据报、ICMP报文和ARP报文的格式,以及不同网络通信的过程。文章通过抓包分析展示了IP数据报、ICMP数据报和ARP数据报的具体信息,包括MAC地址、IP地址、ICMP类型和代码、以及ARP的硬件类型、协议类型、操作类型等。通过这些分析,可以更好地理解网络协议的工作机制和数据传输过程。
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
|
Ubuntu 安全 Linux
Linux必备|如何重置忘记的 Root 密码
Linux必备|如何重置忘记的 Root 密码
2267 7
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决

热门文章

最新文章