①双指针思路
1.先统计一下要替换元素的个数
目的:扩容字符串
2.fast指向新字符串的尾部,slow指向旧字符串的尾部
slow指针用于判断,fast指针是指向待填充的位置
当slow遍历完就是结束的时候。同时slow==fast
3.更详细的思路参照:代码随想录。但代码实现有些不同!
②代码实现
#include<iostream>
#include<string>
using namespace std;
int length(string s) {
int cnt = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
cnt++;
}
}
return cnt;
}
int main()
{
const char num[]="number";
string s;
cin >> s;
//————下面是扩容过程
int len = length(s);//取得需要替换的个数
int agoLength = s.size();//记录初始字符串的个数
s.resize(s.size()+5*len);//替换数字,需要扩容字符串
//————上面是扩容过程
//定义快慢指针(快指针填充,慢指针判断)
int slow = agoLength - 1;
int fast = s.size() - 1;
//开始替换(快指针填充,慢指针判断)
while (slow<fast) {//在替换结束之前:slow<fast恒成立
if (s[slow] >= '0' && s[slow] <= '9') {//匹配到,开始填充
//其实可以使用一个数组存放number!
//然后通过遍历这个数组替换数组s的值。
for(int i = 5 ; i>=0 ; i--){//因为number最后一个索引是5,从后往前填充
s[fast--]=num[i];
}
slow--;
}
else {
s[fast--] = s[slow--];
}
}
cout << s;
return 0;
}