#include<iostream>
#include<string>
using namespace std;
/*
思路:
先将s1和s2遍历一遍将其转化为小写字符串
从头遍历s1单词书,结束条件是到最后一个空格,但是这样会导致最后一个字符串遍历不到
如果没有碰到空格,则字符串长度计数器strlen++,碰到了空格,则代表字符串结束
此时判断字符串的长度计数变量strlen是否等于s2的长度,如果等于,则遍历字符串,进行单个字符判断。
每有一个字符相同则正确长度计数变量stright++,最后判断stright是否和s2的长度相等,若相等则代表是相同的字符串,
此时再判断a是否存储了首个相等字符串的首个下标,若没有则a=i-s1.size(),strnum++,如果有则strnum++
循环判断完毕要记得重置strlen和stright计数器
最后一个字符串则从尾遍历碰到的首个空格符号,然后再跟上面判断条件一样即可
最后判断a是否等于-1,如果等于-1则代表没有出现过相同字符串,则输出-1
如果a不等于-1,则代表出现过相同字符串 输出相同字符串的个数和首个字符下标,中间空格符隔开
*/
int main()
{
int strlen=0,stright=0,strnum=0,z;
string s1, s2;
//输入字符串
getline(cin, s2); //可以获取空格,需包含头文件string
getline(cin, s1);
int a=-1;//用来确认是否存放了首个字符串的首个字符下标
for(int i = 0; i < s2.size(); i++ )
{//转化为小写字符串
s2[i] = tolower(s2[i]);
}
for(int i = 0; i < s1.size(); i++ )
{//转化为小写字符串
s1[i] = tolower(s1[i]);
}
for(int i=0;i<s1.size();i++)
{//没有遍历到最后一个字符串
if(s1[i]!=' ')
{
strlen++;//字符串长度
}
else
{//碰到空格,开始计算长度是否和s2相等,相等则再继续判断是否字符相等
if(strlen == s2.size())
{//相等则遍历
z=i-1;//z作为i的替代计数
for(int j=s2.size()-1;j>=0;j--,z--)
{//从后往前遍历
if(s1[z]==s2[j])
{//如果字符相等则stright+1
stright++;
}
}
if(stright == s2.size())
{//如果相等的字符数等于s2字符串的长度
strnum++;//正确的字符串个数+1
if(a==-1)
{//如果首个相同字符串还没出现,则设定首个下标位置
a=i-s2.size();
}
}
stright =0;//重置正确的字符个数
}
strlen=0;//碰到空格则遍历字符长度计数器归零
}
}
strlen =0;
stright=0;
for(int i=s1.size()-1;s1[i]!=' ';i--)
{//s1从尾往前遍历,碰到空格结束
strlen++;
}
if(strlen == s2.size())
{//如果最后一个字符串长度相等,则进行遍历
for(int i=0;i<strlen;i++)
{//
if(s1[i] == s2[i])
{
stright++;
}
}
if(stright == s2.size())
{//如果正确的字符个数和s2的字符个数相等,则代表是相同字符串
if(a == -1)
{//查看是否出现了第一个字符串 如果没出现 则赋值给a
a=s1.size()-strlen;
strnum++;
}
else{//如果出现了则正确的字符串计数器+1
strnum++;
}
}
}
if(a == -1)
{
cout<<a;
}
else{
cout<<strnum<<" "<<a;
}
}
牛客[NOIP2011]统计单词数
于 2023-02-04 17:25:50 首次发布