zoukankan      html  css  js  c++  java
  • 【面试题目】转贴-字符串反转(不包括某些特殊单词)

    字符串反转

    我没有记错的话是一道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 }
  • 相关阅读:
    hdu3613(扩展KMP)
    hdu4333(扩展KMP)
    poj 2185
    指数型母函数
    java高精度hdu4043
    卡特兰数简单应用
    hdu3625(第一类斯特林数)
    卡特兰数和斯特林数(转载)
    hdu4045(递推)
    java 中sendredirect()和forward()方法的区别
  • 原文地址:https://www.cnblogs.com/dracohan/p/1362609.html
Copyright © 2011-2022 走看看