• 多校第十场1009 CRB and String题解


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5414

    题意:给你两个字符串s和t,你能够在字符串s中随意选一个字符c,在该字符c后插入一个字符d(d!=c)。问经过多次此操作,是否能将字符串s转化成字符串t

    思路:初读题理解错题意,以为仅仅能在原串的每一个字符后面加入一个不同于这个字符的一个字母,其实能够反复操作,比方,ap。转换成axxp,能够先在a后面加入一个x。就变成了axp。再次操作。在a后面加入一个x,就能够变成axxp。

    换句话说:就是保证若第二个字符串t前k个字符都同样,那么第一个字符串s的前k个字符也必须同样(1),剩下的,即使出现插入的字母和前一个字符同样,我们也能够理解成前一个字符是插在前面那个字符的后一个的字符(2),好吧。说晕了。举个栗子:apple,转换成appple,假设第二个p是插入到p后面的字符,依照题目要求是不能够的,可是同一时候我们能够把第一个p当成插在a后面的字符,这样就符合条件了,这就是之前(2)的解释;再举个栗子:apple。转换成aapple。后一个字符串前两个字符都是a,而第一个字符串仅仅有一个a字符。这样第二个字符串中的第二个字符a就必须是a后面插入的。这样明显就不符合条件,ok,(1)解释完了。。

    详细操作步骤,就是先保证若字符串t前k个字符都同样,那么字符串s的前k个字符也必须同样,然后在剩下的字符串中按顺序找到第一个字符串的每一个字母即可

    代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <set>
    #include <map>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <numeric>
    #include <iomanip>
    #include <bitset>
    #include <sstream>
    #include <fstream>
    #define debug "output for debug "
    #define pi (acos(-1.0))
    #define eps (1e-8)
    #define inf 0x3f3f3f3f
    #define ll long long
    using namespace std;
    const int maxn = 100005;
    char str1[maxn],str2[maxn];
    int l1,l2;
    int check()
    {
          int i,j;
            for(i=0;i<l2;i++)
            {
                if(str2[i]!=str2[0])
                    break;
            }
            for(j=0;j<i;j++)
            {
                if(str1[j]!=str2[j])
                    return 0;
            }
            while(j<l1)
            {
                for(;i<l2;i++)
                {
                    if(str1[j]==str2[i])
                        break;
                }
                if(i==l2)
                    return 0;
                i++;
                j++;
            }
            return 1;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s%s",str1,str2);
             l1=strlen(str1);
             l2=strlen(str2);
            if(l2<l1)
            {
                printf("No ");
                continue;
            }
            if(check())
                printf("Yes ");
            else
                printf("No ");
        }
        return 0;
    }


  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6942118.html
Copyright © 2020-2023  润新知