c/c++整理--字符串(5)

来源:互联网 发布:算法之美 pdf 百度云 编辑:程序博客网 时间:2024/06/05 21:12

一、反转字符串,但其指定的子串不反转

给定一个字符串、一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。

例如:

第一个字符串:Welcome you, my friend

子串:you

输出:dneirf ym,you emocleW

#include <iostream> #include <cassert>#include <string.h>#include <stack>   using namespace std;  const char* reverse(const char* s1, const char* token){stack<char> 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";cout<<"before:"<<welcome<<endl;cout<<"after:"<<reverse(welcome, token)<<endl;    return 0;  }  
这道题对我来说还是有些难度,刚一接触这道题的时候,虽说想到了一个思路,但是一直没法调试成功,最终还是上网搜了下才解决,感觉对这个字符串的处理方面还是有所欠缺,很多问题只是有了大概的思路,但是具体的实现还是一个很大的问题啊。这段时间要多花点时间在这个字符串的处理上了。

输出:

before:Welcome you, my friendafter:dneirf ym ,you emocleW

二、编写字符串反转函数strrev

字符串反转函数strrev,要求时间和空间的效率都尽量高。

方法一

void change(char* str){int len = strlen(str);int i = 0;for(i = 0; i < len/2; i++){char temp = str[i];str[i] = str[len-i-1];str[len-i-1] = temp;}}

方法二

void change(char* str){int len = strlen(str);int i = 0;for(i = 0; i < len/2; i++){str[i] ^= str[len-i-1];str[len-i-1] ^= str[i];str[i] ^= str[len-i-1];}}

方法三

char* change(char* str, int len){if(len <= 1){return str;}char t = *str;*str = *(str + len - 1);*(str + len - 1) = t;return (change(str+1, len-2)-1);}





0 0
原创粉丝点击