创意标题匹配问题 解析| 豆包MarsCode AI 刷题

如题:

判断一个title字符串是否可以由template模版生成。这道题完全可以由正则表达式判断,拿template="ad{xyz}cdc{y}f{x}e"举例:

"ad{xyz}cdc{y}f{x}e" 将通配符都替换->"ad.cdc.f.e" 前后加开始结束符号->"^ad.*cdc.*f.*e$"。 用这个^ad.*cdc.*f.*e$正则表达式就可以判断全部字符串是否又该template模版生成。

详细解释这个正则表达式: ^:表示字符串的开始。这意味着匹配的字符串必须以接下来的模式开头。 ad:就是ad原生字符 .: '.'匹配除换行符以外的任何单个字符。''表示前面的字符可以出现0次或多次。 cdc:就是cdc原生字符 .:'.'匹配除换行符以外的任何单个字符。''表示前面的字符可以出现0次或多次。 f:就是f原生字符 .:'.'匹配除换行符以外的任何单个字符。'*'表示前面的字符可以出现0次或多次。 e:就是e原生字符 $:表示字符串的结束。这意味着匹配的字符串必须以 "e" 结尾。 有了该思路,所以完整代码为:

import java.util.regex.Pattern;
 
public class Main {
    public static String solution(int n, String template, String[] titles) {
        // 将模板转换为正则表达式
        String regex = template.replaceAll("\\{[^}]*}", ".*");
        // 确保匹配整个字符串
        regex = "^" + regex + "$"; 
        
        // 创建一个StringBuilder来存储结果
        StringBuilder result = new StringBuilder();
        
        // 检查每个标题是否匹配正则表达式
        for (int i = 0; i < n; i++) {
            if (Pattern.matches(regex, titles[i])) {
                result.append("True");
            } else {
                result.append("False");
            }
            if (i < n - 1) {
                result.append(",");
            }
        }
        
        return result.toString();
    }
 
    public static void main(String[] args) {
        //  测试样例1
        String[] testTitles1 = {"adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"};
        String[] testTitles2 = {"CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"};
        String[] testTitles3 = {"abcdefg", "abefg", "efg"};
 
        System.out.println(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1).equals("True,False,False,True"));
        System.out.println(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2).equals("False,False,False,False,False,True"));
        System.out.println(solution(3, "a{bdc}efg", testTitles3).equals("True,True,False"));
    }
}

一些正则表达式基础知识:

字符类:

  1. [abc]:代表a或者b,或者c字符中的一个。
  2. [^abc]:代表除a,b,c以外的任何字符。
  3. [a-z]:代表a-z的所有小写字符中的一个。
  4. [A-Z]:代表A-Z的所有大写字符中的一个。
  5. [0-9]:代表0-9之间的某一个数字字符。
  6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
  7. [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。

逻辑运算符:

  1. &&并且
  2. |:或者
  3. \:转义字符

预定义字符:

  1. "." : 匹配任何字符。
  2. "\d":任何数字[0-9]的简写;
  3. "\D":任何非数字[^0-9]的简写;
  4. "\s": 空白字符:[ \t\n\x0B\f\r] 的简写
  5. "\S": 非空白字符:[^\s] 的简写
  6. "\w":单词字符:[a-zA-Z_0-9]的简写
  7. "\W":非单词字符:[^\w] 数量词:
  8. X? : 0次或1次
  9. X* : 0次到多次
  10. X+ : 1次或多次
  11. X{n} : 恰好n次
  12. X{n,} : 至少n次
  13. X{n,m}: n到m次(n和m都是包含的)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值