首页 > 其他分享 >HJ71 字符串通配符

HJ71 字符串通配符

时间:2024-09-19 16:05:02浏览次数:1  
标签:匹配 HJ71 通配符 110 && 字符串 dp

HJ71 字符串通配符

题目:https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036?tpId=37&tqId=21294&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

先读入两个字符串a,b,然后进行大小写转换,统一转化成小写。字符串下标从1开始存储。dp[i][j]表示对于a的前i位字符串和b的前j位字符串是否能匹配,如果可以则为1,否则为0。

处理边界情况:dp[0][0]=1;即两串字符串都为空字符串时是匹配的。然后for(int i=1;i<=la;i++)if(a[i]=='*')dp[i][0]=1;else break;由于*可以对应空字符串,所以***的情况是可以和空字符串匹配的,所以要预处理为1.

状态转移方程:

- `a[i] == b[j]` 或 `a[i] == '?'` 且 `b[j]` 是合法字符时,`dp[i][j] = dp[i-1][j-1]`。
- `a[i] == '*'` 且 `b[j]` 是合法字符时:
- `dp[i][j] = dp[i-1][j-1]`:`*`匹配一个字符
- `dp[i][j] = dp[i][j-1]`:`*`匹配多个字符
- `dp[i][j] = dp[i-1][j]`:`*`匹配空字符

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char a[110],b[110];
 4 int la,lb,dp[110][110];
 5 bool Check(char c){
 6     if(c>='a'&&c<='z')return 1;
 7     if(c>='0'&&c<='9')return 1;
 8     return 0;
 9 }
10 int main(){
11     scanf("%s",a+1);
12     scanf("%s",b+1);
13     la=strlen(a+1); lb=strlen(b+1);
14     for(int i=1;i<=la;i++)
15         if(a[i]>='A'&&a[i]<='Z')a[i]=a[i]-'A'+'a';
16     for(int i=1;i<=lb;i++)
17         if(b[i]>='A'&&b[i]<='Z')b[i]=b[i]-'A'+'a';
18     dp[0][0]=1;
19     for(int i=1;i<=la;i++) if(a[i]=='*')dp[i][0]=1;else break;
20     for(int i=1;i<=la;i++){
21         for(int j=1;j<=lb;j++){
22             if(a[i]==b[j])dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
23             else if(a[i]=='?'&&Check(b[j]))dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
24             else if(a[i]=='*'&&Check(b[j])){
25                 dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
26                 dp[i][j]=max(dp[i][j],dp[i][j-1]);
27                 dp[i][j]=max(dp[i][j],dp[i-1][j]);
28             }
29         }
30     }
31     if(dp[la][lb])puts("true");else puts("false");
32 }

by:AlenaNuna

标签:匹配,HJ71,通配符,110,&&,字符串,dp
From: https://www.cnblogs.com/AlenaNuna/p/18420758

相关文章

  • C和指针:字符串
    字符串、字符和字节字符串基础字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。字符串长度就是字符串中字符数。size_tstrlen(charconst*string);string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。#include......
  • xml字符串转JSON字符串
    xml字符串转JSON字符串,可以直接通过jackson提供的方法进行快速转换。在web项目中通常会引入spring-boot-starter-web依赖。但是spring-boot-starter-web依赖包括Jackson的JSON处理库(如jackson-databind、jackson-core等),不一定直接包含处理XML的Jackson库(如jackson-dataformat-xml......
  • 对象字符串转换为数组对象
    数据源格式:'{\n"填写说明":"每个学期的开学之前,需要调整这里面的配置,这样课表和一卡通对接的才能是正确的数据",\n"学年编号":"2024-2025",\n"学期编号":"1"\n}'"{"填写说明":"每个学期的开学之前,需要调整这里面的配置,这样课表和一卡......
  • 2414.最长的字母序连续字符串的长度
    字母序连续字符串是由字母表中连续字母组成的字符串。换句话说,字符串"abcdefghijklmnopqrstuvwxyz"的任意子字符串都是字母序连续字符串。例如,"abc"是一个字母序连续字符串,而"acb"和"za"不是。给你一个仅由小写英文字母组成的字符串s,返回其最长的字母序连续子字......
  • c++1095: 时间间隔(多实例测试) (字符串和字符以及数字的转换)
    问题描述:题目描述从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示。要求程序定义如下两个函数,并在main()中调用这两个函数实现相应的功能/*三个形参分别为为用于表示一个时间点的时、分、秒,函数返回对应的秒。*/int HmsToS(int......
  • 查询字符串在数据库哪些表那些列存在/根据字符串快速定位表定位列
    1SETQUOTED_IDENTIFIEROFF2GO3SETANSI_NULLSOFF4GO56IFEXISTS(SELECT*FROMdbo.sysobjectsWHEREid=OBJECT_ID(N'sp_FindString')ANDOBJECTPROPERTY(id,N'IsProcedure')=1)7DROPPROCEDUREsp_FindString8GO......
  • 2606. 找到最大开销的子字符串
    题目链接2606.找到最大开销的子字符串思路前缀和/动态规划-最长子数组和-简单变体题解链接【转换】最大子数组和(Python/Java/C++/Go)关键点无时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现(动态规划):classSolution:defmaximumCostSubstring(......
  • ICPC2021 沈阳站 M String Problem 题解 | 十种做法一网打尽 , 一道题带你回顾字符串科
    题目传送门题意给定一个字符串,求每个前缀的字典最大序子串。注意到:对于每个前缀$s_{[1,i]}$,字典序最大子串的右边界一定是\(i\)。随着着\(i\)的增大,字典序最大子串的左边界一定是单调不减的。解法不分先后。后缀数组SASA&SAM后缀数组&后缀自动机SA对所有......
  • 56.【C语言】字符函数和字符串函数(strtok函数)(未完)
    目录12.strtok函数(较复杂)*简单使用总结:*优化12.strtok函数(较复杂)*简单使用strtok:stringintotokenscplusplus的介绍点我跳转翻译:函数strtokchar*strtok(char*str,constchar*delimiters);总结:delimiters参数指向一个字符串,定义了用......
  • Day3:删除一个字符串中另一个字符串的内容
    题目:str1:welcometomyhousestr2:come删除str1中出现的所有str2的字符,删除之后结果为wltyhuspublicstaticvoidmain(String[]args){Stringstr1="welcometomyhouse";Stringstr2="come";ArrayList<Character>ret=newAr......