zoukankan      html  css  js  c++  java
  • 带通配符的字符串匹配

    总时间限制: 
    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 }
    
    
    


     
    
    
    
    




  • 相关阅读:
    Oracle自增ID实现
    mysql5修改用户密码及远程访问
    关于线程中修改UI的控件属性
    Javascript 保持浮动位置
    Linq To Entity 查询条件扩展
    反转字符顺序
    VB6.0 二分法解方程
    支持库:FileHelper
    C# 计算加减乘除
    Linq.GroupBy使用示例
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4892770.html
Copyright © 2011-2022 走看看