zoukankan      html  css  js  c++  java
  • (全国多校重现赛一) J-Two strings

    Giving two strings and you should judge if they are matched. 
    The first string contains lowercase letters and uppercase letters. 
    The second string contains lowercase letters, uppercase letters, and special symbols: “.” and “*”. 
    . can match any letter, and * means the front character can appear any times. For example, “a.b” can match “acb” or “abb”, “a*” can match “a”, “aa” and even empty string. ( “*” will not appear in the front of the string, and there will not be two consecutive “*”. 

    Input

    The first line contains an integer T implying the number of test cases. (T≤15) 
    For each test case, there are two lines implying the two strings (The length of the two strings is less than 2500). 

    Output

    For each test case, print “yes” if the two strings are matched, otherwise print “no”.

    Sample Input

    3
    aa
    a*
    abb
    a.*
    abb
    aab

    Sample Output

    yes
    yes
    no

    题意:给两个字符串,a固定,b由英文字符和*和.组成,“.”可以变成任意字符,“*”和前一字符一样,且前一个字符的数量为任意多个;求是否可让b变成和a一样‘;

    题解:DP;dp[i][j]表示字符串b从1~i与a从1~j是否完全匹配;

    由于字符不为空,且第一个字符不为*,没连续的*;

    如果b第二个为“*”,的话dp[2][0]=1;

    如果b[i]==a[j] ,则dp[i][j]可以由dp[i-1][j-1]转化而来;

    如果b[i]==".",则b[i]可以为任何字符,dp[i][j]可有由dp[i-1][j-1]转化而来;

    如果b[i]=="*": 

               1.如果匹配0则dp[i][j]由dp[i-2][j]转化而来,如果匹配1个,dp[i][j]=dp[i-1][j];

               2.如果匹配多个 dp[i][j] = max(dp[i][j],max(dp[i][j-1],dp[i-1][j-1]));

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mx = 3e3+10;
    int n,m,len1,len2;
    char str[mx],stc[mx];
    int dp[mx][mx];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
    	{
            scanf("%s",str+1);
            scanf("%s",stc+1);
            len1 = strlen(str+1);
            len2 = strlen(stc+1);
            memset(dp,0,sizeof(dp));
            dp[0][0] = 1;
            for(int i=1;i<=len2;i++)
    		{
                if(i==2&&stc[i]=='*') dp[i][0]  = 1;
                for(int j=1;j<=len1;j++)
    			{
                    if(isalpha(stc[i]))
    				{
                        if(str[j]==stc[i]) dp[i][j] = dp[i-1][j-1];
                    }
    				else if(stc[i]=='.') dp[i][j] = dp[i-1][j-1];
    				else
    				{
                        dp[i][j] = max(dp[i][j],max(dp[i-1][j],dp[i-2][j]));
                        if((dp[i][j-1]||dp[i-1][j-1])&&str[j]==str[j-1])
                        dp[i][j] = max(dp[i][j],max(dp[i][j-1],dp[i-1][j-1]));
                    }
                }
            }
            puts(dp[len2][len1]?"yes":"no");
        }
        return 0;
    }
    
  • 相关阅读:
    IDEA 2019.3 最新激活教程,有效期到 2089 年!
    【猫狗数据集】读取数据集的第二种方式
    【猫狗数据集】计算数据集的平均值和方差
    【colab pytorch】其它注意事项
    【colab pytorch】训练和测试常用模板代码
    【colab pytorch】数据预处理
    【colab pytorch】提取模型中的某一层
    【colab pytorch】模型权重初始化
    【猫狗数据集】使用预训练的resnet18模型
    【猫狗数据集】使用top1和top5准确率衡量模型
  • 原文地址:https://www.cnblogs.com/csushl/p/9386497.html
Copyright © 2011-2022 走看看