user-0 提问: 求助，

回复:
user: user-1
content: 引用 12 楼 Just、一缕阳光 的回复:[quote=引用 11 楼 袁君元的回复:]哦，原来是这样，那只需要把我的程序稍作修改就可以，加一个输入测试数据的个数就可以了，这个就交给楼主自己加了，顺便锻炼一个楼主 多谢大佬们精彩纷呈的指点，你的代码的确很好，受教了。但是我还是想弱弱的问一句，对于我自己的代码，为什么在如下这个代码的判断中，当a不是b的子列时，还能将b赋给c。 if(a[k][i]!=b[k][j]){          j++; }else{ c[k][i]=b[k][j]; i++,j++;  ｝[/quote]  你这个程序从输入就有问题，你先自己调试一下！

user: user-1
content: 哦，原来是这样，那只需要把我的程序稍作修改就可以，加一个输入测试数据的个数就可以了，这个就交给楼主自己加了，顺便锻炼一个楼主

user: user-2
content: 引用 6 楼 自信男孩 的回复:[quote=引用 5 楼 袁君元 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No [/quote] 代码没问题，我是用楼主的测试用例测试你的代码，但是你的代码没有输入个数的，所以会有问题

user: user-1
content: 引用 6 楼 自信男孩 的回复：[quote=引用 5 楼 袁君元 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No [/quote]同样的代码运行出不同的结果，难道有鬼

user: user-1
content: 引用 6 楼 自信男孩 的回复：[quote=引用 5 楼 袁君元 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No [/quote]好奇怪哦，我也是直接运行的我的代码，结果是正确的。那个break确实多余了，可以去掉

user: user-2
content: if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。          return 0;         break;         }  这个代码中的break是冗余的代码，不会执行到break,return就直接跳出函数了。

user: user-2
content: 引用 5 楼 袁君元 的回复:[quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？     [/quote]  这个是我粘贴你的代码，然后测试之后输出的： sequence subsequence No person compersion No

user: user-1
content: 引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 袁君元 的回复:] 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）[/quote]  我这输出是正确的呀，就是输出的Yes，你在哪里运行出来是No了？？？

user: user-0
content: 引用 11 楼 袁君元的回复:哦，原来是这样，那只需要把我的程序稍作修改就可以，加一个输入测试数据的个数就可以了，这个就交给楼主自己加了，顺便锻炼一个楼主 多谢大佬们精彩纷呈的指点，你的代码的确很好，受教了。但是我还是想弱弱的问一句，对于我自己的代码，为什么在如下这个代码的判断中，当a不是b的子列时，还能将b赋给c。 if(a[k][i]!=b[k][j]){          j++; }else{ c[k][i]=b[k][j]; i++,j++;  ｝

user: user-2
content: 引用 3 楼 袁君元 的回复:本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }  建议先测试一下，看是否满足条件，比如： sequence, subsequence（这个输入输出的是No，我想应该输出Yes吧）

user: user-1
content: 本题的思路：将s从开始字符逐次在t中查询，找到了要标记一下位置j 把j+1赋值给flag(表示t进行下一次比对的起始位置)，这样下次查找的时候就从标志位开始查找。这样就能保证s中的字符在t中的相对顺序一致，这样就可以不用考虑这个子串到底是通过增加字符还是减少字符得到的。这个是字符串处理中的技巧。 有什么不懂的可以问哦！ 附上完整的代码和注释：  #include<iostream> #include<cstring> using namespace std; int check(string t,int lent,string s,int lens) { 	int flag=0;//设置找到的标记位。 	int i,j; 	for(i=0; i<lens; i++) { 		for(j=flag; j<lent; j++) { 			if(s[i]==t[j]){ 				flag=j+1;//记录好标志位。下一次就从t的下一位开始找  				break;//跳出内层循环，又把s的下一个字符拿出来比较。  			} 		} 		if(j==lent){//全部都遍历了t的字符都没有找到。就可以说明它不是子串了。  		return 0; 		break; 		}  	} 	return 1; 	 } int main() { 	string s,t; 	while(cin>>s>>t) { 		int lens=s.length(); 		int lent=t.length(); 		int ans=check(t,lent,s,lens); 		if(ans==1) 			cout<<"Yes"<<endl; 		else 			cout<<"No"<<endl; 	} 	return 0; }

user: user-2
content: #include<stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_COL_SZ  80  int main(void) { #if 1      int n, i, j;     char **src_str, **sub_str, *tmp_str;      scanf("%d", &n);      src_str = (char **)malloc(n * sizeof(char *));     if (!src_str)         return -1;     for (i = 0; i < n; i++) {         src_str[i] = (char *)malloc(sizeof(char) * MAX_COL_SZ);         if (!src_str[i]) {             for (j = 0; j < i; j++)                 free(src_str[j]);             free(src_str);             return -1;         }     }      sub_str = (char **)malloc(n * sizeof(char *));     if (!sub_str)         return -1;     for (i = 0; i < n; i++) {         sub_str[i] = (char *)malloc(sizeof(char) * MAX_COL_SZ);         if (!sub_str[i]) {             for (j = 0; j < i; j++)                 free(sub_str[j]);             free(sub_str);             return -1;         }     }      for (i = 0; i < n; i++)         scanf("%s%s", sub_str[i], src_str[i]);      for (i = 0; i < n; i++) {         tmp_str = src_str[i];         for (j = 0; sub_str[i][j]; j++) {             if ((tmp_str = strchr(tmp_str, sub_str[i][j])) == NULL)                 break;         }         if (sub_str[i][j] == '\0')             printf("Yes\n");         else             printf("No\n");     }  #else     int t,k,f,i,j,A;     scanf("%d",&t);     char a[t][100],b[t][100],c[t][100];      for(i=0;i<t;i++){         //scanf("%s%s",&a[i],&b[i]);         scanf("%s%s", a[i], b[i]);    //remove the signal '&'         c[i][0]='\0';     }         for(k=0;k<t;k++){         A=0;         for(i=0,j=0;a[k][i]!='\0';){             if(a[k][i]!=b[k][j]){                 j++;             }else{                 c[k][i]=b[k][j];                 i++,j++;             }         }            for(i=0;a[k][i]!='\0';i++){             if(c[k][i]!=a[k][i]){                 A=1;break;             }         }          if(A==1)printf("No\n");         else printf("Yes\n");       } #endif     return 0; }   char **alloc_mem(int row, int col) {     char **str;     int i, j;      str = (char **)malloc(row * sizeof(char *));     if (!str)         return NULL;     for (i = 0; i < row; i++) {         str[i] = (char *)malloc(sizeof(char) * col);         if (!str[i]) {             for (j = 0; j < i; j++)                 free(str[j]);             free(str);             return NULL;         }     }      return str; }  供参考～ 建议使用库函数能让代码更简单一些

user: user-3
content: 我也是一个新手，学到的知识也不是很多，我就从我的角度看了看，说错了什么请忽略😄 1.在定义a,b,c数组时应该用动态内存分配，原因好像是给数组分配空间时是在预编译时做的，此时还没有输入t，所以会出错 2.a和b是二维数组，所以a[i]是一维数组，它本身就是一个地址，指向a[i][0]，所以不需要& 3.因为是在b中找a中的元素，所以肯定是b先结束，所以比较时应该判断b 4.比较a和c时，可以用strcmp函数，它包含在string.h头文件中，是用来比较数组的，相等的话会返回0 5.注意格式，保持锯齿状，方便看 其他的好像没问题，反正我是看不出来了😂