您的位置:首页 > 其它

【算法习作】字符串处理两例

2012-12-21 15:41 78 查看
作者: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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: