PTA1071等 单词匹配替换与去除多余空格--双指针法

双指针思想

核心还是两重循环,最外层取当前字符,此时内循环为下一个字符,只要内循环匹配不到单词之间的空格一直累加到新字符串。一旦遇到空格跳出内循环,此时新字符串即是所取的单词。把里面的i赋给外部,但是要-1。因为内循环结束后会执行外循环的i++,使得i额外+1。但是并不是要一定有两个指针,核心是内部的指针达成目的后赋给外部指针

举例acwing 770.单词替换

在这里插入图片描述
这里我们要匹配所有you换为I,就用到了双指针。

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s, a, b, t, ans;
    // 从标准输入获取三行字符串,分别存储在 s、a、b 中
    getline(cin, s);
    getline(cin, a);
    getline(cin, b);
    
    int len = s.size(); // 获取字符串 s 的长度
    int sign = 0; // 标记是否到达字符串 s 的末尾
    
    for(int i = 0; i < len; i++) {
        while(s[i] != ' ' && i < len) {//双指针核心实现
            t += s[i]; // 构建单词
            i++;
            if (i == len - 1)
                sign = 1; // 到达字符串 s 的末尾
        }
        
        if(t == a) {
            t = b; // 如果当前单词与 a 相等,用 b 替换它
        }
        
        if (sign == 0) {
            ans += t + ' '; // 将处理后的单词或单词加上空格(如果不是最后一个单词)追加到 ans 中
        } else {
            ans += t; // 如果是最后一个单词,不加空格
        }
        
        t = ""; // 清空临时单词
    }
    
    cout << ans; // 输出替换处理后的结果字符串
    return 0;
}

典型举例 去掉字符串连续空格->只有一个空格

这里就用伪代码说明了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
    string m;
    getline(cin, m); // 从标准输入获取一行字符串并存储在变量 m 中
    string r;
    
    for (int i = 0; i < m.size(); ++i) { // 遍历输入的字符串 m
        if (m[i] != ' ') // 如果当前字符不是空格
            r += m[i]; // 将字符加入结果字符串 r
        else {
            r += ' '; // 否则,加入一个空格到结果字符串 r
            int j = i + 1;
            while (j < m.size() && m[j] == ' ')
                j++; // 跳过连续的空格
            i = j - 1; // 更新 i 以避免重复处理空格
        }
    }
    

PTA1071

for (int i = 0; i < s_copy.size(); ++i) {
        string sub;
        while (s_copy[i]!=' '&&i<s_copy.size())
            sub+=s_copy[i],i++;    //同样是要拿出一句英文中的一个单词
        //if (sub.empty()==0) word[sub]++;
    }
for(int i=0;i<s.size();i++)  //具体内容不用管,仍然是双指针,这里就用了俩个。
    {
        int j=i;
        string res="";
        while((s[j]>='a'&&s[j]<='z')||(s[j]>='0'&&s[j]<='9'))
        {
            res+=s[j];
            j++;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天真且kk

觉得有帮助可以意思一下哈:)

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

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

打赏作者

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

抵扣说明:

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

余额充值