https://www.luogu.com.cn/problem/P1308
思路:由于两个字符串查找时不区分大小写,所以可以直接将两个字符串转换为统一的大写或者小写处理,用STL中的transform可以实现大小写转换,如下所示:
string str1 = 'werADE', str2 = 'nweufhSH';
transform(str1.begin(), str1.end(), str1.begin(), ::tolower);//将str1转换小写字母
transform(str2.begin(), str2.end(), str2.begin(), ::toupper);//将str2转换为大写字母
转换后的结果:
str1 = 'werade', str2 = 'NWEUFHSH';
转换之后,再对两个字符串前后都加上空格,避免字符串1是字符串2的一部分的情况出现(如果单对前面加空格,r若有:str1 = it,str2 = itsyour bag这种情况,会认为查找正确,对后面加空格同理)。最后进行字符串查找,用string自带的find函数。
实现:
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
string t;
cin >> s; //cin在缓存区将字符串读走,剩下\n在缓存区,若不加处理,getline遇\n会停止读入
cin.ignore(); //吞掉\n
getline(cin, t); //当输入的字符串有空格时,可以用getline读入
transform(s.begin(), s.end(), s.begin(), :: tolower); //转换为小写,toupper为大写
transform(t.begin(), t.end(), t.begin(), :: tolower);
//string str1 = s + ' ';//遇到s = it,t = kit me情况的时候会WA
//string str2 = t + ' ';
string str1 =' ' + s + ' ';
string str2 =' ' + t + ' ';
int pos = str2.find(str1);
if(pos == -1){
cout << "-1" <<endl;
return 0;
}
int ans = 0, temp = pos;
while(pos != -1){ //string :: npos相当于-1 ,都是查找失败的情况
pos =str2.find(str1, pos + 1); //注意这里是pos + 1,如果不加1的话,每次查找都是第一次查找到的下标,就是一个死循环
ans ++;
}
if(ans){
cout << ans << ' ';
}
cout << temp;
return 0;
}