OpenJudge-1.7.21:单词替换

一、题目链接

http://noi.openjudge.cn/ch0107/21/

二、解题思路(Java)

三、解题思路(C++)

四、Java程序

import java.util.Scanner;

public class Main {
    /**
     * 将字符串中的指定旧单词替换为指定新单词
     *
     * @param text    String类型的对象,代表待替换单词的字符串
     * @param oldWord String类型的对象,代表指定旧单词
     * @param newWord String类型的对象,代表指定新单词
     * @return String类型的对象,将text中的oldWord替换为newWord
     */
    public String replaceWord(String text, String oldWord, String newWord) {
        StringBuilder ans = new StringBuilder(); // 替换后的结果
        String[] words = text.split(" "); // 以空格为分割符,将text分割为若干单词
        if (words[0].equals(oldWord)) { // 如果第一个单词需要被替换
            ans = ans.append(newWord); // 则向ans中添加一个newWord
        }
        else { // 否则第一个单词不需要被替换
            ans = ans.append(words[0]); // 则向ans中添加原第一个单词
        }
        /* 从第二个单词开始,到最后一个单词为止 */
        for (int i = 1; i < words.length; i++) {
            if (words[i].equals(oldWord)) { // 如果当前单词需要被替换
                ans.append(" " + newWord); // 则将一个空格和newWord添加到ans中
            }
            else { // 否则当前单词不需要替换
                ans.append(" " + words[i]); // 则直接添加一个空格和原单词
            }
        }
        return ans.toString(); // 将ans转为String返回
    }

    public static void main(String[] args) {
        Main test = new Main();
        Scanner input = new Scanner(System.in);
        String text = input.nextLine();
        String oldWord = input.next();
        String newWord = input.next();
        System.out.print(test.replaceWord(text, oldWord, newWord));
    }
}

五、C++程序

#include <iostream>
using namespace std;

int main()
{
    string text; // 待替换单词的字符串
    string oldWord; // 指定旧单词
    string newWord; // 指定新单词
    getline(cin, text);
    cin >> oldWord;
    cin >> newWord;
    int n = text.length(); // 字符串的长度
    int m = oldWord.length(); // 旧单词的长度
    int k = newWord.length(); // 新单词的长度
    int pos = 0; // 查找的起始位置
    /* 从pos位置往后,还能够找到单词oldWord */
    while (text.find(oldWord, pos) != text.npos)
    {
        pos = text.find(oldWord, pos); // 首先,定位到当前替换位置pos
        /*
         * 单词oldWord需要被替换的三种可能性:
         * I.   单词oldWord是第一个单词
         * II.  单词oldWord是最后一个单词
         * III. 单词oldWord是中间的单词
         */
        if (pos == 0 && !isalpha(text[pos + m]) ||
            !isalpha(text[pos - 1]) && pos + m == n ||
            !isalpha(text[pos - 1]) && !isalpha(text[pos + m]))
        {
            text.replace(pos, m, newWord); // 将单词oldWord替换为单词newWorld
            pos = pos + k; // 下一次查找的起始位置
        }
        else // 否则,查找到的oldWord并不是单独的单词
        {
            pos++; // 从当前替换位置的后一个位置继续查找
        }
    }
    cout << text;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江苏科技大学_计算机学院_潘磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值