问题
给定一个字符串,一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。
输入:第一个字符串:“Welcome you, my friend”
子串:“you”
输出:“dneird ym ,you emocleW”
分析
1,扫描一遍第一个字符串,然后用stack把它反转,同时记录下子串的出现的位置;
2,扫描一遍把记录下来的子串再用stack反转;
3,将堆栈里的字符弹出,这样子串又恢复了原来的顺序;
代码
#include <iostream>
#include <cassert>
#include <stack>
using namespace std;
const char* reverse(const char* s1,const char *token)
{
stack<int> stack1;
const char *ptoken =token,*head =s1,*rear =s1;
assert(s1&&token);
while(*head!='\0')
{
while(*head!='\0'&&*ptoken==*head)
{
ptoken++;
head++;
}
if(*ptoken =='\0')
{
const char* p;
for(p = head-1;p>=rear;p--)
{
stack1.push(*p);
}
ptoken = token;
rear = head;
}
else
{
stack1.push(*rear++);
head = rear;
ptoken = token;
}
}
char *pReturn = new char[strlen(s1)+1];
int i = 0;
while(!stack1.empty())
{
pReturn[i++] = stack1.top();
stack1.pop();
}
pReturn[i] = '\0';
return pReturn;
}
int main()
{
char welcome[] ="Welcome you, my friend";
char token[]= "you";
const char *pRev = reverse(welcome,token);
cout<<"before reverse:"<<endl;
cout<<welcome<<endl;
cout<<"after reverse:"<<endl;
cout<<pRev<<endl;
return 0;
}