判断一个字符串是否含有相同字符

一、题目

        判断一个字符串str是否含有相同的字符,假设字符为ASCII码表上的字符(前127位,不包括扩展字符)。

二、分析

       大家很容易想到的一个方法是,依次取一个字符x,然后遍历整个字符串,如果x==str[i],则返回true。当所有的字符都取出完毕都还没有发现相等,则返回false。该方法原理很简单,代码也很容易写出来,如下:

#include<stdio.h><pre name="code" class="cpp">#include<stdlib.h>
#include<string.h>
void main(int argc, char* argv[]){char* str = "abcdefg12345ah";int i, j;int ret=-1;for (i = 0; i<strlen(str);i++){for (j = i + 1; j < strlen(str);j++){if (str[i]==str[j]){ret = true;} }}ret > 0 ? (printf("含有相同字符\n")) : (printf("没有相同字符\n"));return;}

          另外一种方法,我们设置一个数组,标志该字符是否被访问过,然后遍历这个字符串,如果访问到了该字符则设置该标志为true。如果再次访问到了,则立即返回true。如果遍历完成,都没有重复访问,则返回false;代码如下: 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(int argc, char* argv[])
{
	char* str = "5bcdefg12345ah";
	int visited[127];//用数组标志该字符是否被访问过
	int i;
	int index;//数组下标
	int ret=-1;//结果
	for (i = 0; i<strlen(str);i++)
	{
		index = (int)str[i];//取ASCII码值作为下标
		if (visited[index]<=0)
		{
			visited[index] = 1;
		} 
		else
		{
			ret = 1;
		}
	}
	ret > 0 ? (printf("含有相同字符\n")) : (printf("没有相同字符\n"));
	return 0;
}


我们来做时间复杂度的分析:

第一个算法用了两层循环,运算次数为(n-1)*n/2,所以时间复杂度为o(n2);

第二个算法仅用了一层循环,时间复杂度为o(n);

所以从时间复杂度来看,明显第二个算法优于第一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值