NCSTOJ 1362字符串替换
题目描述:
编写一个程序实现将字符串中所有的"you"替换成"we"
输入:
输入包含多行数据,每行数据是一个字符串,长度不超过1000,数据以EOF结束
输出:
对于输入的每一行,输出替换后的字符串
样例输入:
you are what you do
样例输出:
we are what we do
通常思路就是扫一遍字符串,碰到’y’就看后面两个是不是’o’和’u’,然后把位置后移3个,继续扫,输入因为有空格并且要求以EOF结束,所以用getline()来读入
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main()
{
string ss;
while(getline(cin,ss))
{
for(int i=0;i<ss.length();++i)
{
if(ss[i]=='y'&&ss[i+1]=='o'&&ss[i+2]=='u')//滑动窗口
{
printf("we");
i+=2; //因为还要++i,所以只+2
}
else
printf("%c",ss[i]);
}
printf("\n");
}
return 0;
}
其实就是关于串的模式匹配算法,找对应的下标,什么BF,KR,KMP,都太复杂了,看懂都麻烦,实现还要维护一堆东西,蒟蒻的我怎么可能实现,想要高端点的的那为啥不用string类的find()和replace()函数
find
size_type find(
const value_type* ptr,
size_type _Off = 0) const;
参数:
ptr 成员函数要搜索的 C 字符串
_Off 搜索开始处的索引
返回值:
搜索成功时,则为搜索的子字符串的首个字符的索引;否则为 npos
replace
basic_string<CharType, Traits, Allocator>& replace(
size_type _Pos1,
size_type _Num1,
const value_type* ptr);
参数:
_Pos1 操作数 字符串替换开始的索引
_Num1 最大操作数 字符串中要替换的字符数
ptr C字符串,它将是操作数字符串的字符源(就是你用来替换的字符串)
返回值:
操作数进行替换字符串(替换完的字符串)
简单的小例子,用find()在str1中找str2出现的位置,并用replace()做替换
string str1="I LOVE NCSTOJ";
string str2="NCST";
int pos=str1.find(str2);
//int pos=str1.find("NCST"); //直接打一个字符或字符串也行
if(pos==string::npos) // 如果str1中找不到str2那么返回值一定是npos ,一般为-1
cout<<"不存在"<<endl;
else
{
string name=str1;
(1) name.replace(pos,4,"GREAT");
(2) //name.replace(pos,string::npos,"GREAT");//npos为长度参数,表示直到字符串结束
cout<<name<<endl; //cout,cout,cout!!!printf不行,因为是string
}
(1)结果
(2)结果
本题代码:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string ss;
while(getline(cin,ss)) //getline,getline,getline!!!
{
while(ss.find("you")!=string::npos)
ss.replace(ss.find("you"),3,"we"); //换3个
cout<<ss<<endl; //cout,cout,cout!!!
}
return 0;
}
关于npos:
size_t类型,初始化为-1。
size_t为无符号的整数类型可表示的元素数、 字符串中的索引。也就是说其是一种用来记录大小的数据类型。
平时用sizeof()运算获得的就是size_t类型,可以强制转换为int。
#include<stddef.h>
#include<limits>
size_t npos=-1;
cout<<"npos值: "<<npos<<endl;
cout<<"size_t最大值: "<<numeric_limits<size_t>::max()<<endl;
cout<<"对npos进行强制转换后:"<<(int)npos<<endl;
这也就解释了返回值为什么既可以等于npos又可以等于-1