在字符串中查找是否有重复字符(转)
炽翼铁冰
posted @ 2012年11月27日 20:53
in C(转载)
, 2039 阅读
http://blog.csdn.net/lilypp/article/details/6124683
【方法1】这是最节省内存的方法,但是效率一般般。复杂度为O(n2)。
思路是,从字符串的第一个字符开始,看后面有没有和它相同字符。
bool RepeatChar_2(char* str) { if (*str == 0) return false; for (char *p = str; *p != 0; p++) { for (char *q = p + 1; *q != 0; q++) { if (*p == *q) { return true; } } } return false; }
【方法2】此类题目追求的所谓最优解是复杂度越低越好,这个方法效率很高,O(N),空间换时间,需要辅助空间。思路是,开辟一个具有256个元素的整型数组,为什么是256个元素呢,因为ASCII字符一共256个(从0开始,前128个为常用的字符,如运算符、字母、数字等键盘上可以显示的,后128个为特殊字符,是键盘上找不到的字符)。这个数组的index就是字符的ASCII码,值就是该元素出现的次数。
bool RepeatChar_1(char* str) { if (*str == 0) return false; int num[256] = {0}; char *p = str; while(*p !=0) { if (num[*p] >=1) { return true; } num[*p]++; //字符范围为0~128,扫描字符串,对应数组下标的值+1,重复的话即return p++; } return false; }
【方法3】
bool RepeatChar_3(char* str) { if (*str == 0) return false; int num[256] = {0}; char *p = str; while (*p != 0 && num[*p] == 0) { num[*p++] = 1; } return *p == 0 ? false : true; }