原题: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;
}