对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。
给定一个原字符串A和他的长度,请返回逆序后的字符串。
这种问题没有涉及到高级的算法技术,或者巧妙的解题设计。实际上它的解法有很多种。其中一种是:
- 利用包含句子的字符串构建ostringstream
- 利用>>运算符把各个单词依次填入vector<string>里面
- 将vector逆序输出到string内
这种方法利用了ostringstream按照空格自动划分单词的特性。
如果只用浅层次的指针工具的话:
- 将整个字符串逆序
- 将每个单词逆序
void reverse(char*const P,char*const Q){
char* p=P,*q=Q;
while(p<q){ //这种指针两头动的情况,用不等于会出错
char x=*p;
*p=*q;
*q=x;
p++;
q--;
}
}
string reverseSentence(string A, int n) {
if(A.empty())
return A;
char* a=&A[0];
reverse(a,a+n-1);
//两层循环指定单词的区间
for(int i=0;i<n;++i){
if(a[i]!=' '){
int j;
for(j=i+1;j<n;++j){
if(a[j]==' ')
break;
}
//要么a[j]==' '要么j==n越界
reverse(a+i,a+j-1);
i=j-1;//记住外面还有一个i++,下次循环开始的时候i==j
}
}
return A;
}