AlenaNuna

导航

HJ71 字符串通配符

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

posted on 2024-09-19 16:01  AlenaNuna  阅读(9)  评论(0编辑  收藏  举报