我在做紫书题目的时候,做到了子序列的问题,可是我觉得我的代码卡在了奇怪的地方,当我输入本应输入No结果的时候,程序停不下来,并且还不打印我想要的“No!”。我的程序里已经把flag给打印出来了。
题目描述:输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变),得到字符串s。例如,abcde可以得到bce,但无法得到dc。
我的思路:我定义了一个flag,他是用来判断是否符合情况的。使用类似双指针的方法去一个个检查是否一样。如果检查到最后一个都检查得到的话,就让flag=1;否则就是0。这部分我觉得没什么问题。但是后面打印的时候很怪,希望得到解答,感激不尽!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[1000];
char t[10000];
int main(void)
{
while (scanf("%s %s", s, t) != EOF)
{
int slen = strlen(s);
int tlen = strlen(t);
printf("slen=%d,tlen=%d\n", slen, tlen);
int flag = 0;
// printf("s=%s,t=%s\n", s, t);
int j = 0;
for (int i = 0; i < tlen; )
{
for (; j < slen; )
{
printf("i=%d,j=%d\n", i, j);
if (t[i] == s[j])
{
if (i == (tlen - 1))
{
flag = 1;
}
i++;
j++;
}
else j++;
printf("flag=%d\n", flag);
}
}
if (flag)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
return 0;
}
``

这个是我想要的结果,但是。。。

当无法找到dc的情况下,for (int i = 0; i < tlen; ) 这里就死循环了,所以在第33行后插入一行 if(j == slen) break; ,内循环结束后都跳出,再根据flag的值做判断, 修改如下,供参考:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[1000];
char t[10000];
int main(void)
{
while (scanf("%s %s", s, t) != EOF)
{
int slen = strlen(s);
int tlen = strlen(t);
printf("slen=%d,tlen=%d\n", slen, tlen);
int flag = 0;
// printf("s=%s,t=%s\n", s, t);
int j = 0;
for (int i = 0; i < tlen; )
{
for (; j < slen; )
{
printf("i=%d,j=%d\n", i, j);
if (t[i] == s[j])
{
if (i == (tlen - 1))
{
flag = 1;
}
i++;
j++;
}
else j++;
printf("flag=%d\n", flag);
}
if(j == slen) break; //修改
}
if (flag)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
return 0;
}
这代码可以优化下,一层循环就可以了,修改如下,供参考:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s[1000];
char t[10000];
int main(void)
{
int i=0,j=0,flag=0;
while (scanf("%s %s", s, t) != EOF)
{
int slen = strlen(s);
int tlen = strlen(t);
printf("slen=%d,tlen=%d\n", slen, tlen);
for (i=0,j=0,flag=0; j < slen;)
{
if (t[i] == s[j])
{
if (i == (tlen - 1))
{
flag = 1;
}
i++;
j++;
}
else
j++;
}
if (flag)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
return 0;
}