首页 > 代码库 > 数组与字符串 1.5

数组与字符串 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 }

测试文件

aaaabaaaaabaabbaaabbaaaaabbbbbbabcdefghello word     dfd     dfd    asdf                              sd

 

数组与字符串 1.5