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;
    }
    
  • 相关阅读:
    css3之背景background-origin,background-clip,background-size
    css3之字体@font-face
    css3之文本text-overflow 与 word-wrap, word-break
    Ng第十二课:支持向量机(Support Vector Machines)(三)
    Ng第十二课:支持向量机(Support Vector Machines)(二)
    Ng第十二课:支持向量机(Support Vector Machines)(一)
    Ng第十一课:机器学习系统的设计(Machine Learning System Design)
    Ng第十课:应用机器学习的建议(Advice for Applying Machine Learning)
    Ng第九课:神经网络的学习(Neural Networks: Learning)
    Ng第八课:神经网络表述(Neural Networks: Representation)
  • 原文地址:https://www.cnblogs.com/csushl/p/9386497.html
Copyright © 2011-2022 走看看