字符个数统计

描述:编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内( 0~127,包括0和127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次。 例如,对于字符串 abaca而言,有 a、b、c 三种不同的字符,因此输出3 。

输入描述:输入一行没有空格的字符串。

输出描述:输出输入字符串中范围在(0~127,包括0和127)字符的种数。

示例1:输入abc,输出:3

示例2:输入:aaa,输出:1

方法一:

思路分析:本题的实质就是输出字符串不相同字符的个数,可以首先进行一次循环,循环结果为输出不相同的字符串,将字符串的结果存在res中,最后直接返回res的长度即可。

图解

alt

核心代码

str1 = input()
res = ''#存放地址
len1 = len(str1)#循环长度
for i in range(0,len1):
    if str1[i] not in res:
        res = res + str1[i]#添加
print(len(res))#返回长度

时间复杂度:假设字符串长度为n,需要将每一个字符遍历,然后判断是否进行添加,因此时间复杂度为O(n)O(n)

空间复杂度:不需要借助辅助数组,因此空间复杂度为O(1)O(1)

方法二

思路分析

本题也可以首先设定一个str1用于存放输入的数据,因为一共有128个字符,设定一个数组a用于记录字符的次数,若访问过直接记为1,未访问过则使res++(统计字符个数),最终输出res的结果值即可。

核心代码

#include<stdio.h>
#include<string.h>
int main(){
    char str1[1024];//申请一片存储空间,用于存放数据
    scanf("%s",&str1);
    int a[128]={0};//初始化均为0
    int res=0;//存放最终的结果
    for(int i=0;str1[i]!=0;i++){
        if(str1[i]>=0&&str1[i]<128&&a[str1[i]]==0){//标志位为0表示无该字符
            res++;//记录
            a[str1[i]]=1;//对应位置修改为1,表示已经存在该数字
        }
    }
    printf("%d",res);
    return 0;
}

时间复杂度:假设字符串长度为n,需要遍历每一个字符,因此时间复杂度为O(n)O(n)

空间复杂度:需要借助辅助数组,但是数组都是定值,因此空间复杂度为O(1)O(1)