关于c++:BC-字符串匹配1基础上机试题

29次阅读

共计 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' 之前)//}

正文完
 0