【面试题目】转贴-字符串反转(不包括某些特殊单词)

字符串反转

我没有记错的话是一道MSN的笔试题,网上无意中看到的,拿来做了一下。题目是这样的,给定一个字符串,一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。例如:
输入: 第一个字符串: "This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn"
子串: "zhuxinquan"
输出: "nc/moc.zhuxinquan.www//:ptth :etis esenihC s'zhuxinquan si sihT"
一般的方法是先扫描一边第一个字符串,然后用stack把它反转,同时记录下子串出现的位置。然后再扫描一遍把记录下来的子串再用stack反转。我用的方法是用一遍扫描数组的方法。扫描中如果发现子串,就将子串倒过来压入堆栈。
最后再将堆栈里的字符弹出,这样子串又恢复了原来的顺序。源代码如下:

 

 1 #include <iostream>
 2 #include <cassert>
 3 #include <stack>
 4 #include <string.h>
 5 
 6 using namespace std;
 7 //reverse the string 's1' except the substring 'token'.
 8 const char* reverse(const char* s1, const char* token)
 9 {
10     assert(s1 && token);
11     stack<char> stack1;
12     const char* ptoken = token, *head = s1, *rear = s1;
13     while (*head != '\0')
14     {
15         while(*head!= '\0' && *ptoken == *head)
16         {
17             ptoken++;
18             head++;
19         }
20         if(*ptoken == '\0')//contain the token
21         {
22             const char* p;
23             for(p=head-1;p>=rear;p--)
24                 stack1.push(*p);
25 
26             ptoken = token;
27             rear = head;
28         }
29         else
30         {
31             stack1.push(*rear);
32             head=++rear;
33             //ptoken = token;
34         }
35     }
36     char * return_v = new char[strlen(s1)+1];
37     int i=0;
38     while(!stack1.empty())
39     {
40         return_v[i++] = stack1.top();
41         stack1.pop();
42     }
43     return_v[i]='\0';
44     return return_v;
45 }
46 int main(int argc, char* argv[])
47 {
48     
49     cout<<"This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn\n";
50     cout<<reverse("This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn","zhuxinquan");
51     return 0;
52 }

 

posted on 2008-12-25 22:19  醉清风JM  阅读(543)  评论(0编辑  收藏  举报

导航