计算字符串中每个字符出现的个数

  方法不难,但是最近在看哈希表,队散列法有了一定的认识,突然觉得解决这个问题的方法认识应该提高,

首先分析问题,要统计一个字符串每个字符出现的次数,那么绝对是要遍历整个字符串,这个问题的难点在于怎么确认

当前字符是否在前面已经出现,不能取一个字符就与整个字符串一一对比,这样的时间复杂度就是O(n^2)。

  解决方法:可以把字符转换成对应的整数,这个过程类似于获得哈希值,然后如果在出现这个字符就直接把哈希值地址保存的变量加一,

遍历之后就可以得到每一个字符出现的次数。具体代码如下

char* str = "1234fhasfhdsffffffffaafdskajhfcacjkldsjfdsjakf";
int StringGetIndexNum(char* str,char character)
{
    int buff[256];
    while(*str !=''){
        printf("%c,%d
",*str,(int)*str);
        buff[(int)*str]++;
        str++;
    }
    printf("字符[%c]出现的次数是:[%d]
",character,buff[(int)character]);
    return 0;
}

解释一下。这里给定的字符串必须是ascii码范围的字符,中文字符无效。无法统计,定义一个256大小的数组保存字符出现的次数(ascii码范围),

(int)*str,获得的是字符对应的ascii码,将ascii码当做数组下标,然后数组值累加。这个是一个典型的空间换时间的方法,因为申请的256个空间不是每一个都用到。

同样的原理可以用java实现:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "112fjdsajjsafidsafsalfdsa";
        HashMap<Byte, Integer> hashMap = new HashMap<>();
        byte[] ArrayChar = string.getBytes();
        for (byte b : ArrayChar) {
            if(hashMap.get(b) == null){
                hashMap.put(b, 1);
            }else{
                hashMap.put(b, hashMap.get(b)+1);
            }
            
        }
        System.out.println("j:"+hashMap.get("f".getBytes()[0]));
    }

使用hashMap保存字符与出现的次数,byte[] ArrayChar = string.getBytes();类似于取得字符的哈希值,然后对哈希值进行遍历,统计次数。

这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责
原文地址:https://www.cnblogs.com/ashitaka/p/5973631.html