NCSTOJ 1362 字符串替换

本文深入解析字符串替换的基本算法,通过具体实例演示如何使用C++的getline()和string类的find()与replace()函数实现字符串中特定子串的查找与替换。文章详细介绍了滑动窗口方法及更高效的方法,适合初学者和需要复习此知识点的程序员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NCSTOJ 1362字符串替换

题目描述:

​ 编写一个程序实现将字符串中所有的"you"替换成"we"

输入:

​ 输入包含多行数据,每行数据是一个字符串,长度不超过1000,数据以EOF结束

输出:

​ 对于输入的每一行,输出替换后的字符串

样例输入:

​ you are what you do

样例输出:

​ we are what we do

​ 通常思路就是扫一遍字符串,碰到’y’就看后面两个是不是’o’和’u’,然后把位置后移3个,继续扫,输入因为有空格并且要求以EOF结束,所以用getline()来读入

关于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值