本程序是判别冒号前的字符串是否是冒号后的字符串的子序列。(子序列并不一定连续,但先后顺序一样)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | /**************************************************************** * Description: * Author: Alex Li * Date: 2023-09-07 10:30:32 * LastEditTime: 2023-09-07 11:14:05 ****************************************************************/ #include <iostream> using namespace std; int main() { char a[100][100], b[100][100]; string c[100]; string tmp; int n, i = 0, j = 0, k = 0, total_len[100], length[100][3]; cin >> n; getline(cin, tmp);//读入换行符,避免后面出错 for (i = 0; i < n; i++) { getline(cin, c[i]); //读入三个字符串 total_len[i] = c[i].size(); } for (i = 0; i < n; i++) { j = 0; while (c[i][j] != ':') {//将冒号:前的字符串存入a[i][] a[i][k] = c[i][j]; k = k + 1; //统计冒号前的字符个数 j++; //j是冒号的位置,后面字符开始于j+1 } length[i][1] = k - 1; //冒号前的字符串长度,前面k多加了。 a[i][k] = 0; //加上字符'\0',字符串结束,因为'\0'的ASII码是0 k = 0; for (j = j + 1; j < total_len[i]; j++) {//冒号后面字符存入b[i][] b[i][k] = c[i][j]; k = k + 1; } length[i][2] = k - 1; //同上 b[i][k] = 0; k = 0; } for (i = 0; i < n; i++) {//遍历3个字符串 if (length[i][1] >= length[i][2]) //若冒号:前面字符个数多,输出“NO” cout << "NO,"; else { k = 0; for (j = 0; j < length[i][2]; j++) {//遍历b[i][]的每一个字符 if (a[i][k] == b[i][j]) //如果有相同的字符,移动到a[i][]字符串的下一个字符 k = k + 1; if (k > length[i][1])//如果a[i][]中的字符都找到了,推出循环。 break; } if (j == length[i][2]) cout << "NO,";//说明中途没有退出循环,也就是a[i][]没在b[i][]里 else cout << "YES,"; //中途退出循环,说明a[i][]在b[i][]里 } } cout << endl; return 0; } |
输入:
3
AB:ACDEbFBkBD
AR:ACDBrT
SARS:Severe Atypical Respiratory Syndrome