UVA All in All 10340

题目描述

输入两个字符串s和t,判断是否可以从t中删除0个或者多个字符(其他字符顺序不变),得到字符串s。例如,abcde可以得到bce,但无法得到cb。

Input

输入多组数据

每组一行包含两个字符串s和t,两字符串之间用空格隔开。

字符串长度在100000以内

Output

输出Yes或No

Sample Input
sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
Sample Output
Yes
No
Yes
No
数组不要开的太小,英文描述是没给字符串的最大长度的,有点坑。开始的时候开了1w,runtime error

迷之卡题,num = j + 1,这个地方改了一下就过了,惊了,原来是这个原因

之前有的字母已经比较过了,写num  = j,相当于又比较了一遍

#include 
#include 
char s[100000];
char t[100000];
int main(void)
{

    while(scanf("%s", s) != EOF && scanf("%s", t) != EOF){
        int lens, lent;
        lens = strlen(s);
        lent = strlen(t);
        int i, j, num = 0, flag = 0, val = 0;
        for(i = 0; i < lens; i++){
            flag = 0 , val = 0;
            for(j = num; j < lent; j++){
                if(t[j] == s[i]){
                    num = j + 1;
                    flag = 1;
                    break;
                }
            }
            if(flag)
                val = 1;
            else
                break;
        }
        if(val)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

不得不说还是单条链遍历比较好,我这种做法容易出错,而且定义了两个flag变量(flag , val)来进行判断很繁琐

其实定义一个长度变量如len,能从t中找到s的顺序字符就加1,最后比较s的长度和len的大小也可以

另一种相对简洁的做法

#include 
#include 
char s[100000];
char t[100000];
int main(void)
{

    while(scanf("%s", s) != EOF && scanf("%s", t) != EOF){
        int lens, lent;
        lens = strlen(s);
        lent = strlen(t);
        int i, j, len = 0;
        for(i = 0, j = 0; i < lens && j < lent;){
            if(s[i] == t[j])
                i++, j++, len++;
            else
                j++;
        }
        if(len == lens)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}


你可能感兴趣的:(UVA)