统计字符串中字符种类及频次

要求

  实现对于给定字符串,能够统计出出现了哪些字符,以及每个字符出现的频次。这是构造哈夫曼编码等问题的一个基本功能模块。

实现

  计算机中的字符种类是有限的,只考虑ASCII中规定的字符则不超过256个。为此,考虑空间换时间的做法,直接用数组来解决。这个实现的核心就在这里,使用一个长度大于等于256的int型数组,每个数组元素为ASCII表中相应元素的出现频次。扫描给定的字符串,将相应的数组元素值加一,最后输出那些值不为0的元素对应的字符即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "iostream"
#include "string"
using namespace std;

#define maxn 256 // maxn为所有可能出现的字符种类数

class Strings{
public:
string str;
void count(string str){
int freq[maxn];
for(int i=0; i<maxn; ++i) freq[i] = 0; // 初始化频次数组
for(int i=0; i<str.length(); ++i){
freq[(int)str[i]]++;
}
for(int i=0; i<maxn; ++i){
if(freq[i] != 0)
cout << '\'' << (char)i << "\': " << freq[i] << endl;
}

}
};

int main(int argc, char const *argv[])
{
Strings s;
string str;
getline(cin, str);
s.count(str);
return 0;
}

扩展

  在类中通过更改count方法可以根据要求扩展不同的功能,比如如果要求只打印字母表中的字母,对于非字母表的字符返回错误警告,或者要求不统计空格 ‘ ‘ 等等,可以通过增加if条件语句等手段实现。


转载请注明来源:©Tinshine