炽翼铁冰's Blog

Trying to become a programmer
匹配函数

在字符串中查找是否有重复字符(转)

炽翼铁冰 posted @ 2012年11月27日 20:53 in C(转载) , 1994 阅读

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;

}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter