一、题目
判断一个字符串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);
所以从时间复杂度来看,明显第二个算法优于第一个。