zoukankan      html  css  js  c++  java
  • 【算法习作】字符串处理两例

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    1.按词倒置一个句子

    题目:例如”I am a student”,经处理后得到”student am a I”,限定除了一个空格外单词间没有任何其他分隔符。

    解析:将整个字符串倒置后分别对每一个词进行倒置即可。

      1: /*
    
      2:  * =====================================================================================
    
      3:  *
    
      4:  *       Filename:  rotateString.cpp
    
      5:  *
    
      6:  *    Description:  rotate a string with the sequences of a word kept
    
      7:  *
    
      8:  *        Version:  1.0
    
      9:  *        Created:  04/15/2011 04:28:13 PM
    
     10:  *       Revision:  none
    
     11:  *       Compiler:  g++
    
     12:  *
    
     13:  *         Author:  gnuhpc (http://blog.csdn.net/gnuhpc), warmbupt@gmail.com
    
     14:  *
    
     15:  * =====================================================================================
    
     16:  */
    
     17: 
    
     18: #include "../include/utils.h"
    
     19: 
    
     20: void rotateString(string& target_string)
    
     21: {
    
     22:     size_t size = target_string.size();
    
     23:     size_t begin = 0;
    
     24:     size_t end   = size-1;
    
     25:     reverseString(target_string,begin,end);
    
     26: 
    
     27:     begin = 0;
    
     28:     end   = 0;
    
     29: 
    
     30:     while(end!=size)
    
     31:     {
    
     32:         if(target_string[end]!=' '){
    
     33:             ++end;
    
     34:         }
    
     35:         else{
    
     36:             reverseString(target_string,begin,end-1);
    
     37:             begin = end+1;
    
     38:             ++end;
    
     39:         }
    
     40:     }
    
     41: }
    
     42: 
    
     43: int main(int argc, char *argv[])
    
     44: {
    
     45:     string target_string;
    
     46:     cout << "please tell me the string:"<<endl;
    
     47:     getline(cin, target_string);
    
     48: 
    
     49:     cout << target_string << endl;
    
     50:     rotateString(target_string);
    
     51:     cout << target_string << endl;
    
     52: }

     

    2.左旋转字符串

    题目:输入:abcdefg,2  , 输出:cdefgab ,复杂度要求:不使用额外空间存储字符串。

    思路:S=abcdefg  ,   S1=ab, S2=cdefg, !S1=ba, !S2 = gfedc => !((!S1)(!S2)) 即为所求。也就是说先按欲倒置的位置将原字符串划分为两个子串,分别倒置,然后再将整个字符串倒置即可求得。

      1: /*
    
      2:  * =====================================================================================
    
      3:  *
    
      4:  *       Filename:  rotateString.cpp
    
      5:  *
    
      6:  *    Description:  rotate a string from a specific position
    
      7:  *
    
      8:  *        Version:  1.0
    
      9:  *        Created:  04/15/2011 04:28:13 PM
    
     10:  *       Revision:  none
    
     11:  *       Compiler:  g++
    
     12:  *
    
     13:  *         Author:  gnuhpc (http://blog.csdn.net/gnuhpc), warmbupt@gmail.com
    
     14:  *
    
     15:  * =====================================================================================
    
     16:  */
    
     17: 
    
     18: #include "../include/utils.h"
    
     19: 
    
     20: void rotateString(string& target_string, const size_t position)
    
     21: {
    
     22:     assert((position>1)&&(position<target_string.size()));
    
     23:     int size = target_string.size();
    
     24:     size_t A_begin = 0;
    
     25:     size_t A_end   = position-1;
    
     26:     size_t B_begin = position;
    
     27:     size_t B_end   = size-1;
    
     28:     reverseString(target_string,A_begin,A_end);
    
     29:     reverseString(target_string,B_begin,B_end);
    
     30:     reverseString(target_string,A_begin,B_end);
    
     31: 
    
     32:     cout << target_string <<endl;
    
     33: }
    
     34: 
    
     35: int main(int argc, char *argv[])
    
     36: {
    
     37:     string target_string;
    
     38:     genRandomString(target_string,10);
    
     39:     size_t position;
    
     40:     cout << target_string << endl;
    
     41:     cout << "please tell me the position:"<<endl;
    
     42:     cin >> position;
    
     43: 
    
     44:     rotateString(target_string,position);
    
     45: }

    辅助函数reverseString为:

      1: void reverseString(string &target_string, size_t begin, size_t end)
    
      2: {
    
      3:     while(begin<end){
    
      4:         target_string[begin]^=target_string[end];
    
      5:         target_string[end]^=target_string[begin];
    
      6:         target_string[begin]^=target_string[end];
    
      7:         ++begin;
    
      8:         --end;
    
      9:     }
    
     10: }

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

  • 相关阅读:
    AVR开发 Arduino方法(六) 内存子系统
    AVR开发 Arduino方法(五) 模数转换子系统
    AVR开发 Arduino方法(四) 串行通信子系统
    AVR开发 Arduino方法(三) 定时/计数器子系统
    AVR开发 Arduino方法(二) 中断子系统
    2014.5.17—所谓生活,就是让自己变得更好
    2014.5.10—做事分清时间地点
    2014.5.7—社交网络用户心理分析
    2014.5.7—20岁这几年
    2014.5.5—反向绑定域名,无需工信部备案
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2828067.html
Copyright © 2011-2022 走看看