题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 1 <= n<=500
题目来源
输入描述
输入一行没有空格的字符串。
输出描述:
输入字符串 中范围在(0~127,包括0和127)字符的种数。输入:
输入:
abc
输出:
3
输出:
输入:
aaa
输出:
1
思路
利用“以空间换时间”方法,构造长为128的辅助数组count,遍历字符串str将其中所有元素利用强制类型转换转换为int型,并将对应count数组中的元素进行++,最后遍历count数组,不为零元素的个数即为字符串中字符的种数
具体实现
#include <stdio.h>
#include <string.h>
int main() {
int count[128]; //构造辅助数组
int i, j, k, num = 0;
for (i = 0; i < 128; i++)
count[i] = 0; //初始化辅助数组
char str[1000] = {0};
gets(str);
for (j = 0; j < strlen(str); j++) {
count[(int)str[j]]++;
}
for (k = 0; k < 128; k++) {
if (count[k] != 0)
num++;
}
printf("%d", num);
return 0;
}
时间复杂度
时间复杂度为O(n) 空间复杂度为O(1)
小结
本题较为简单,但切记眼高手低,在获取字符串ASCII值时思考了好一会儿,最终采用了强制类型转换的方法,还可以采用toascii函数:
函数名: toascii
头文件:<ctype.h>
函数原型: int toascii(int ch); 或者在输出时改为%d形式