在这道题上想了好几天,冥(借)思(阅)苦(题)想(解)之后恍然大悟,没想到还能这样操作
假如要在"toto tototo to toto to"中匹配单词"to",仔细一想这代码估计挺复杂的
但是我们已知:
1.必须完整匹配单词"to",像"toto"这种就不行
2.每个单词之间用空格隔开
由此我们可以不匹配"to"而是前后都有一个空格的"_to_"(为了显示明显我这里用_代替空格)
这样就可以直接用find函数直接查找,不必担心是否完全匹配的问题
但是要注意:
我们也要在待匹配的长字符串的开头和结尾各加上一个空格:"_toto tototo to toto to_"
因为像末尾的to如果后面没有空格的话那跟"_to_"匹配不上了就
以下便是完整代码:
#include<iostream>
#include<string>
using namespace std;
int main() {
string c;//要匹配的字符串
string s;//待匹配的长字符串
cin >> c;
getchar();//把\n从缓冲区取出,防止getline直接跳过
getline(cin, s);//读取一行待匹配的长字符串
//这俩循环是将俩字符串都统一改成全小写
for (int i = 0; i < c.length(); i++)
{
c[i] = tolower(c[i]);
}
for (int i = 0; i < s.length(); i++)
{
s[i] = tolower(s[i]);
}
//都各自在前后加一个空格
c = " " + c + " ";
s = " " + s + " ";
//先find一下有没有
if (s.find(c) == string::npos) {
cout << -1;//没有就直接输出了
}
else {//有的话就开始找
int firstPos = s.find(c);//记录第一次出现的位置
int pos = firstPos;
int cnt = 0;//统计完全匹配次数
while (pos!=string::npos)
{
cnt++;
pos = s.find(c, pos + 1);
}
cout << cnt << " " << firstPos;
}
return 0;
}
注意不要想着在找第一次出现位置时用 find_first_of 函数,因为他是不完全匹配,我就是当时没记清,导致总共就俩AC的,还debug了半天QAQ