算法1:双重循环(暴力枚举) $O(n^2)$
#include <bits/stdc++.h>
using namespace std;
string a, b;
int main() {
getline(cin, a);
getline(cin, b);
a = " " + a + " ";
b = " " + b + " ";
//统一格式
for (int i = 0; i < a.size(); ++ i) a[i] = toupper(a[i]); //tolower()
for (int i = 0; i < b.size(); ++ i) b[i] = toupper(b[i]);
int p = -1, cnt = 0;
for (int i = 0; i < b.size(); ++ i) {
if (b[i] == a[0]) { //开头相等-进入遍历
int j = 0;
while (b[i+j] == a[j]) j++;
if (j == a.size()) {
if (p == -1) p = i;
cnt ++;
}
// bool f = 1; //for循环遍历,标记
// for (int j = 0; j < a.size(); ++ j)
// if (b[i+j] != a[j]) {
// f = 0;
// break;
// }
// if (f) {
// if (p == -1) p = i;
// cnt ++;
// }
}
}
if (cnt) cout << cnt << " " << p;
else cout << -1;
return 0;
}
算法2:调用库函数-双重循环() $O(n^2)$
#include <bits/stdc++.h>
using namespace std;
string a, b;
int main() {
getline(cin, a);
getline(cin, b);
a = " " + a + " ";
b = " " + b + " ";
//统一格式
for (int i = 0; i < a.size(); ++ i) a[i] = toupper(a[i]); //tolower()
for (int i = 0; i < b.size(); ++ i) b[i] = toupper(b[i]);
//利用find函数查找 找不到,返回的是2的64次方-1,内存中64位全部是1,就是-1
int p = b.find(a), cnt = 0, st;
if (p != -1) {
st = p; //记录第一次出现的位置
cnt++;
while ((p = b.find(a, p+1)) != -1) cnt++;
cout << cnt << ' ' << st;
} else {
cout << -1;
}
return 0;
}
算法3:把连续不含空格的单词拼接起来,判断是否相等() $O(n^2)$
#include <bits/stdc++.h>
using namespace std;
string a, b;
int main() {
getline(cin, a);
getline(cin, b);
//统一格式
for (int i = 0; i < a.size(); ++ i) a[i] = toupper(a[i]); //tolower()
for (int i = 0; i < b.size(); ++ i) b[i] = toupper(b[i]);
b = b + ' ';//确保最后能走到else中 判断是否相等
string t = "";
int p = -1, cnt = 0;
for (int i = 0; i < b.size(); ++ i) {
if (b[i] != ' ') t += b[i]; //连续字符就拼接起来
else { //是空格
if (t == a) {
cnt++;
if (cnt == 1) p = i - a.size();
}
t = "";
}
}
if (p != -1) cout << cnt << ' ' << p;
else cout << p;
return 0;
}