计算字符串中每个字符出现的个数
方法不难,但是最近在看哈希表,队散列法有了一定的认识,突然觉得解决这个问题的方法认识应该提高,
首先分析问题,要统计一个字符串每个字符出现的次数,那么绝对是要遍历整个字符串,这个问题的难点在于怎么确认
当前字符是否在前面已经出现,不能取一个字符就与整个字符串一一对比,这样的时间复杂度就是O(n^2)。
解决方法:可以把字符转换成对应的整数,这个过程类似于获得哈希值,然后如果在出现这个字符就直接把哈希值地址保存的变量加一,
遍历之后就可以得到每一个字符出现的次数。具体代码如下
char* str = "1234fhasfhdsffffffffaafdskajhfcacjkldsjfdsjakf"; int StringGetIndexNum(char* str,char character) { int buff[256]; while(*str !='\0'){ printf("%c,%d\r\n",*str,(int)*str); buff[(int)*str]++; str++; } printf("字符[%c]出现的次数是:[%d]\r\n",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();类似于取得字符的哈希值,然后对哈希值进行遍历,统计次数。
这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责