一本通——1406:单词替换 详解

原题:http://ybt.ssoier.cn:8088/problem_show.php?pid=1406
题意解析:题目整体是比较好理解的,将输入的文章中的特定单词进行替换即可
解题思路:
这个题目我有两种解题思路:
思路一:利用字符数组来进行,完成输入后,将待替换的单词a与原文s进行逐个单词的比较,如果单词相同,那么输出替换单词b,具体代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	string a,b;
	
	//解题思路:在字符串s中先 查找出单词a,如果是单词a,那么输出b,否则输出当前单词
	getline(cin,s);
	getline(cin,a);
	getline(cin,b);
	
	int len1=s.size();//求取文章的长度
	int len2=a.size();//求取带替换单词的长度
	int j;
	
	for(int i=0;i<len1;i++)//遍历字符串s
	{

		for(j=0;j<len2;j++)//遍历字符串a
		{
			 if(s[i+j]!=a[j])	
                break;//若字符不匹配退出循环,再从第i+1个开始判定
            
            if(i>0&&s[i-1]!=' ')	
                break;//若第i个字符不是文章首且前一个字符不是空格,则不是独立单词,退出循环
		}
		//如果运行到最后字符串a遍历完成且字符串s中该单词对应位置后一位是空格,或者已经运行到最后一个单词了,那么说明文中单词与代替换单词完全对应
		if(j==len2&&(s[i+j]==' '||j+i==len1))
		{
			cout<<b;//于是输出替换单词b,并将遍历字符串s的i移到待替换单词之后
			i=i+j;
			cout<<" ";
		}
		else //如果不满如上述条件,那么即将当前字符输出即可
		{
			cout<<s[i];
		}
	} 
	return 0;
} 

思路二:利用字符串的性质直接进行比较,在第一个字符串的输入过程中,就利用文章特性——每个单词之间以空格为间隔,将每个单词存入字符串数组中,将带替换单词a以及替换单词b输入后直接将a与字符串数组中的单词直接进行比较,如果相等,输出b,如果不相等,输出原单词以及空格即可,代码如下:

本思路参考了[小韦同学]的文章,声明如下
版权声明:本文为CSDN博主「小韦同学」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31790997/article/details/86713902

#include <string> 
#include <iostream>
using namespace std;

const int N = 110;
string s[N];

int main() {
	// 输入的字符串,要被替换的字符串,用来替换的字符串 
	string str, before, after;
	int len = 0;  // 字符数组的下标 
	getline(cin, str);
	for (int i = 0; i < str.size(); i++) {
		if (str[i] != ' ') {  // 若当前字符不是空格时 
			s[len] += str[i];  // 将该字符存到字符数组中 
		} else {  // 当遇到空格时,字符数组下标加一 
			len++;  
		}
	}
	cin >> before >> after;
	for (int i = 0; i < len; i++) {  // 枚举字符数组 
		if (s[i] == before) {  // 若当前字符串为被替换字符串 
			s[i] = after;  // 将该字符串的值改为替换的字符串 
		}
	}
	for (int i = 0; i <= len; i++) {
		cout << s[i] << " ";
	}
	
	return 0;
}

根据小韦同学的思路,改进代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s[201],a,b;
	int i=0;//字符串数组位置
	char d;
	do{
		i++;
		cin>>s[i];输入单词
		d=getchar();//取得单词后的空格
	}while(d==' ');//如果单词后不是空格(是结束符),即跳出循环
	cin>>a>>b;
	for(int j=1;j<=i;j++)
	{
		if(s[j]==a) cout<<b<<" ";//直接将字符串a[i]与a进行比较,如果相等,输出b
		else cout<<s[j]<<" ";//如果不相等,输出当前单词
	}
	return 0;
 }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值