LeetCode刷题笔记(C语言)
Hash应用
Hash通常可以使用在需要统计个数的场景
题一:判定字符是否唯一(实现一个算法,确定一个字符串s的所有字符是否都不同)
- 0 <= len(s) <= 100
- s[i]仅包含小写字母
- 如果你不使用额外的数据结构,会很加分
方法一:使用(顺序查找+比较)法进行对字符串内部等待字符进行判断是否存在重复的字符,也称位运算方法。
代码如下:
1. bool isUnique(char* astr){
2. int len = strlen(astr); //长度
3. int i,j; //i用于顺序查找的下标,j用于追踪后面字符串的下标
4. char temp; //保存第一个到第n-1个字符的临时变量
5. //第一级循环,顺序查找
6. for(i=0;i<len-1;i++) {
7. temp = astr[i]; //将第i个字符与其后面的所有字符进行比较
8. //第二级循环,查询比较
9. for(j=i;j<len-1;j++) {
10. if(temp==astr[j+1]) { //如果有相同的
11. return false;
12. }
13. }
14. }
15. return true;
16. }
方法二:使用哈希(Hash)表查表方式进行字符判断是否重复,其方法为直接寻址法,取关键字或关键字的某个线性函数值为散列地址。
其函数关系式:H(key) = a·key + b (a,b为常数)
本题的函数关系式为:H(key) = 1*key + (-‘a’) (key为’a’到‘z’英文字母)
1. bool isUnique(char* astr){
2. // int len = (int)('z') - (int)('a') + 1; //保存英文字母个数
3. int word[26] = {0}; //建立英文26个字母的哈希表
4. while(*astr != NULL) {
5. word[*astr - 'a'] += 1; //哈希表以字母'a'为对应数值下标0
6. if(word[*astr - 'a'] > 1) { //如果哈希表中当前字母出现次数大于1个
7. return false;
8. }
9. astr++;
10. }
11. return true;
12. }