双指针思想
核心还是两重循环,最外层取当前字符,此时内循环为下一个字符,只要内循环匹配不到单词之间的空格一直累加到新字符串。一旦遇到空格跳出内循环,此时新字符串即是所取的单词。把里面的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++;
}