共计 2873 个字符,预计需要花费 8 分钟才能阅读完成。
给你一个字符串 A 和一个字符串 B,请你计算字符串 B 的所有旋转模式在字符串 A 中的呈现总次数。
阐明:
如果将字符串 B 形容成 B1B2…Bm 的模式(m 是 B 的长度),那么 B1B2…Bm-1Bm,B2B3…BmB1,…,BmB1…Bm-2Bm- 1 就是字符串 B 的所有旋转模式。
输出
输出蕴含多组测试数据。每组输出为两行,第一行输出字符串 A,第二行输出字符串 B。A 的长度不超过 1000,B 的长度不超过 100,所有字符串仅蕴含小写字母。
输入
对于每组输出,输入字符串 B 的所有旋转模式在字符串 A 中的呈现总次数。
样例输出 Copy
abab
ab
aaaa
a
aaaa
aa
样例输入 Copy
3
4
3
代码示例(本人写的,只能过平台,不完满)
//#include<iostream>
//#include<string>
//#include<string.h>
//#include<cstring>
//using namespace std;
//void Find(int i, int n, string &s1,string &s3);
//void change(string &s);
//
//int main() {
// string s1,s2 = "",s3 ="";
// while(getline(cin,s1)) {
// cin >> s2;
// getchar();
//// s3.resize(101);
// int n = s2.length();
// int k,cnt = 0;
// for(int i = 0; (i + n - 1) < s1.length(); i++) {
// k = 0;// 管制 while 循环次数,change 一遍后 break, 要不会有限循环!每次 i 变动后置零
// Find(i,n,s1,s3);// 利用函数 Find()提取 s1[]中的子串赋给 s3[]
//// cout << s3 << endl; 调试用
//// while(strcmp(s2.c_str(),s3.c_str()) != 0){// while(s2 != s3) {// change(s2);// 该函数使短串变换,并让每次变换后的 s2 持续与 S3 进行比拟,看是否相等
// k++;// 记录翻转次数
// if(k >= n) { // 管制 change 次数,change 一轮后退出,不要有限循环
// break;
// }
// }
//// if(strcmp(s2.c_str(),s3.c_str()) == 0){// 两者相等,则呈现一次
// if(s2 == s3) {
// cnt++; // 计数
// }
// s3.clear();// 每次 i 变换即进行过一次 Find 函数都要把 s3 重置,以从新获取 s1 的子串。// }
// cout << cnt << endl;
// }
// return 0;
//}
//void Find(int i,int n, string &s1,string &s3) { // 此处需将 i 和 n 的值都传入函数
// int k,l;
// for(k = i,l = 0; k < i + n; k++,l++) {// 因为在一次接管输出后 n 不变,而 i 在 for 循环中为了管制 s1(即长串) 不超限在递增
// // 故引入 k 使得 k < i +n(而不是间接 k < n), 则每次循环也可循环 n 次,给 s3[]赋值 n 次,与将要比照的 s2[]长度相等
// s3 += s1[k];// 当 i = 0 时,使得 s1 得前 n 个字符 (从 s[i] 开始)赋值给 s3,前面需随着 i 变动同理提取长串中的相邻字符(引入 i 的起因)//// s3[l] = s1[k]; // 切记这么赋值是谬误的,尽管能够提前开拓 s3 的空间(下面的 s3.resize()), 然而会多一个空行
// }
//}
//
//void change(string &s) { // 在 while 循环中会不停调用此函数不停变换短串 s2
// char t;
// int i;
// t = s[0];// 用哨兵暂存储第一个字符
// for(i = 0; i < s.length() - 1; i++) { // 不要超界
// s[i] = s[i + 1];// 将前面的字符赋值给后面,不停实现轮换以测验变换后的多个 s2...... 是否会在 s1 中呈现
// }
// s[i] = t;// 将哨兵中的字符赋值给字符串最初一个地位
//}
//#include<iostream>
//#include<string>
//#include<string.h>
//#include<cstring>
//using namespace std;
//void Find(int i, int n, char s1[],char s3[]);
//void change(char s[]);
//
//int main(){// char s1[1001],s2[101],s3[101];//s1 长串,s2 短串,s3 为提取是 s1 子串
// while(scanf("%s",s1) != EOF){// scanf("%s",s2);
// int n = strlen(s2);
// int k,cnt = 0;
// for(int i = 0; (i + n - 1) < strlen(s1); i++){
// k = 0;// 管制 while 循环次数,change 一遍后 break, 要不会有限循环!每次 i 变动后 k 置零
// Find(i,n,s1,s3);// 利用函数 Find()提取 s1[]中的子串赋给 s3[]
// while(strcmp(s2,s3) != 0){// change(s2);// 该函数使短串翻转,并让每次翻转后的 s2 持续与 S3 进行比拟,看是否相等
// k++;// 记录翻转次数
// if(k >= n){// 管制 change 次数,change 一轮后退出,不要有限循环
// break;
// }
// }
// if(strcmp(s2,s3) == 0){// 两者相等,则呈现一次
// cnt++;
// }
// }
// cout << cnt << endl;
// }
// return 0;
//}
//void Find(int i, int n, char s1[],char s3[]){// 此处需将 i 和 n 的值都传入函数
// int l,k;
// for(k = i,l = 0; k < i + n; l++,k++){// 因为在一次接管输出后 n 不变,而 i 在 for 循环中为了管制 s1(即长串) 不超限在递增
// // 故引入 k 使得 k < i +n(而不是间接 k < n), 则每次循环也可循环 n 次,给 s3[]赋值 n 次,与将要比照的 s2[]长度相等
// s3[l] = s1[k];// 当 i = 0 时,使得 s1 得前 n 个字符 (从 s[i] 开始)赋值给 s3,前面需随着 i 变动同理提取长串中的相邻字符(引入 i 的起因)// }
// s3[l] = '\0';// 最初一个字符增加完结字符 '\0'
//}
//
//void change(char s[]){// 在 while 循环中会不停调用此函数不停变换短串 s2
// char t;
// int i;
// t = s[0];// 用哨兵暂存储第一个字符
// for(i = 0; i < strlen(s) - 1; i++){// s[i] = s[i + 1];// 将前面的字符赋值给后面,不停实现轮换以测验变换后的多个 s2...... 是否会在 s1 中呈现
// }
// s[i] = t;// 将哨兵中的字符赋值给字符串最初一个地位('\0' 之前)//}
正文完