数组与字符串 1.5

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串"aabcccccaaa"会变为"a2b1c5a3"。若“压缩”后的字符串没有变短,则返回原先的字符串。

分析:依次遍历输入字符串的每个字符,若当前字符与前一个字符相同,则计数加1;否则,将前一个字符及其出现次数存入压缩字符串,并将计数置1。

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstring>
 4 #include <sstream>
 5 
 6 using namespace std;
 7 
 8 string compress( string& str );
 9 
10 int main( int argc, char *argv[] ) {
11     string data_file = "./1.5.txt";
12     ifstream ifile( data_file.c_str(), ios::in );
13     if( !ifile.is_open() ) {
14         fprintf( stderr, "cannot open file: %s\n", data_file.c_str() );
15         return -1;
16     }
17     string str;
18     while( getline( ifile, str ) ) {
19         cout <<str <<": ";
20         cout <<compress( str ) <<endl;
21     }
22     ifile.close();
23     return 0;
24 }
25 
26 string compress( string& str ) {
27     int cnt = 1, slen = str.length();
28     if( slen <= 2 ) { return str; }
29     stringstream ss;
30     for( int i = 1; i < slen; ++i ) {
31         if( str[i] == str[i-1] ) { ++cnt; continue; }
32         ss <<str[i-1] <<cnt;
33         cnt = 1;
34     }
35     ss <<str[slen-1] <<cnt;
36     if( slen > ss.str().size() ) { return ss.str(); }
37     return str;
38 }

测试文件

a
aa
ab
aaa
aab
aabb
aaabb
aaaaabbbbbb
abcdefg
hello word
     dfd     dfd
    asdf                              sd

 

posted on 2014-09-14 20:15  游不动の鱼  阅读(158)  评论(0编辑  收藏  举报