如果不需要原地操作,则一遍遍历,将非空串复制,遇到空格加上%20,如果需要原地操作,首先进行遍历出空格的个数x,然后扩容2x,从后往前遍历实现。如果非空格字符串比空格字符串多的多的时候而且字符串非常长的时候使用原地操作节省空间。
下面证明不会发生冲突:
字符串长度为n,空格数为x,扩容以后为n+2x。从后往前遍历到第i个字符的时候,假设经过了j个空格,j⩽\leqslant⩽x,新串占用空间为i+2j,总空间为n+2x,则新串所占用串的头地址为n+2x-i-2j,旧串所占用串的尾地址为n-i-1<n+2x-i-2j,所以不会发生冲突。
实现代码
#include <iostream>
#include <string>using namespace std;int main()
{string s;getline(cin, s);int cnt=0;int len=s.size();for(int i=0 ; i<len; ++i){if(s[i]==' ') ++cnt;}int idx=len+cnt*2;s.resize(idx);for(int i=len-1; i>=0; --i){if(s[i]==' '){s[--idx]='0'; s[--idx]='2'; s[--idx]='%%';} else{s[--idx]=s[i];}}cout<<s;return 0;
}