• 带通配符的字符串匹配


    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符。通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符。 
    你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配。 
    例如,1?456 可以匹配 12456、13456、1a456,但是却不能够匹配23456、1aa456; 
    2*77?8可以匹配 24457798、237708、27798。

    输入
    输入有两行,每行为一个不超过20个字符的字符串,第一行带通配符,第二行不带通配符
    输出
    如果两者可以匹配,就输出“matched”,否则输出“not matched”
    样例输入
    1*456?
    11111114567
    样例输出
    matched

    用bool数组f[i][j]表示A串前i个字符和B串前j个字符.
    当A[i]不为'*',f[i][j]的真假和f[i-1][j-1]相等;
    当A[i]=='*'时,若A[i]表示单字符,则f[i][j]由f[i-1][j-1]的真假转移
    若A[i]表示多字符,
    则f[i][j]由f[i][j-1]的真假转移
            若A[i]表示空,
    则f[i][j]由f[i-1][j]的真假转移
    以上三种满足一个为true即可认为f[i][j]=true;
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<fstream>
     8 #include<queue>
     9 #include<vector>
    10 using namespace std;
    11 char A[800],B[800];
    12 bool f[800][800];
    13 int lena,lenb;
    14 int main(){
    15     scanf("%s%s",A,B);
    16     lena=strlen(A); lenb=strlen(B);
    17     f[0][0]=true;
    18     for(int i=0;i<lena;i++){
    19         if(A[i]=='*'){
    20             f[i+1][0]=true;
    21         }
    22         else break;
    23     }
    24     for(int i=0;i<lena;i++){
    25         for(int j=0;j<lenb;j++){
    26             if(A[i]==B[j]||A[i]=='?'){
    27                 f[i+1][j+1]=f[i][j];
    28                 continue;
    29             }
    30             else if(A[i]=='*'){
    31                 if(f[i][j]==true||f[i][j+1]==true||f[i+1][j]==true)
    32                     f[i+1][j+1]=true;
    33                 else f[i+1][j+1]=false;
    34                 continue;
    35             }
    36             f[i+1][j+1]=false;
    37         }
    38     }
    39     
    40     if(f[lena][lenb]==true){
    41         cout<<"matched"<<endl;
    42         return 0;
    43     }
    44     else{
    45         cout<<"not matched"<<endl;
    46         return 0;
    47     }
    48     return 0;
    49 }
    
    
    


     
    
    
    
    




  • 相关阅读:
    关于MySql中的varchar类型
    分享15个HTML5工具
    MVC的路径查找顺序
    html5画布的旋转效果
    C#将集合快速排序
    一个不错的php验证码的类
    新学C++的for,switch和随机数
    高效率去掉js数组中重复项
    js带上框架和防止被iframe的代码
    请不要对我说“你要马上把这个小问题修改好”
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4892770.html
Copyright © 2020-2023  润新知