如何判断一个字符串中是否存在相同的字符

jenhi 2008-04-07 09:11:53
不能用库函数,要求时间复杂度小于n*n
...全文
622 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
evanever 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Treazy 的回复:]
C/C++ code
bool Fun(char *str)
{
int i;
char Temp[MAX_CHAR+1] = {0};
if(str != NULL)
{
while(*str != '\0')
{
Temp[*str++]++;
}
}
for(i = 0; i<MAX_CHAR+1; i++)
{
if(Temp[i] >=2)
return true;
}
return false;
}
当str的字符串长度小于256时
复杂度为o(1)
当str的字符串长度大于256…
[/Quote]

好方法,空间换时间,改成这样如何,

bool Fun(char *str)
{
int i;
char Temp[MAX_CHAR+1] = {0};
if(str != NULL)
{
while(*str != '\0')
{
Temp[*str]++;
if(Temp[*(str)] >=2)
return true;
str++;
}
}
return false;
}
jiuchang 2008-04-07
  • 打赏
  • 举报
回复
借用一下3楼的代码,直接申请一个256的数组,做桶排序,这样效率最高
bool Fun(char *str)
{
int i;
unsigned char Temp[256] = {0};
if (str == NULL) {
return false;
}
while(*str != '\0')
{
if (Temp[*str] > 0)
return true;
Temp[*str++]++;
}
return false;
}
算法复杂度应该是0(n)的
world007 2008-04-07
  • 打赏
  • 举报
回复
7楼的方法好像不对吧,呵呵
world007 2008-04-07
  • 打赏
  • 举报
回复
时间复杂度是(n*n),是最笨的方法,也就是一个字符在一串字符查找,然后查找完之后再进行下一个字符查找。
但是稍微改进一下就OK了,因为一个字符与另外一个字符进行比较是相互的,不用比较两次,所以2楼的方法就是这个道理,他的时间复杂度是
[n(n-1)]/2,1楼方法如果进行排序的话,如果排序方法选择不当,排序方法的时间复杂度就会达到(n*n)的级别,这是我的愚见。
jenhi 2008-04-07
  • 打赏
  • 举报
回复
3楼的是一个办法,在不要求减小空间的情况下非常好。

6楼的,一个快速排序就已经是N*lgN了吧? 搞不好就N*N了。
lala_benben 2008-04-07
  • 打赏
  • 举报
回复

bool func(char *pstr)
{
char *pHead = pstr;
char *pTemp = NULL;
int nFind = 0;
int nlen = strlen(pstr);
pTemp = pHead + len - 1;
while (pHead != pTemp) {
if (*pHead == *pTemp) {
nFind = 1;
break;
}
pHead++;
pTemp--;
}

if (*pTemp = *pHead) {
nFind = 1;
}

if (nFind == 1) {
return true;
}
else {
return false;
}
}
Supper_Jerry 2008-04-07
  • 打赏
  • 举报
回复 1
快速排序,然后检查相邻的。的确复杂度O(NlgN)
Treazy 2008-04-07
  • 打赏
  • 举报
回复

#define MAX_CHAR 128
qiucp 2008-04-07
  • 打赏
  • 举报
回复

bool HaveSameChar(char *pstr)
{
char *p1 = pstr;
char *p2 = NULL;
while (*p1 != '\0')
{
p2 = p1;
while (*p2 != '\0')
{
p2++;
if (*p2 == *p1)
{
return true;
}
}
p1++;
}
return false;
}
Treazy 2008-04-07
  • 打赏
  • 举报
回复

bool Fun(char *str)
{
int i;
char Temp[MAX_CHAR+1] = {0};
if(str != NULL)
{
while(*str != '\0')
{
Temp[*str++]++;
}
}
for(i = 0; i<MAX_CHAR+1; i++)
{
if(Temp[i] >=2)
return true;
}
return false;
}



当str的字符串长度小于256时
复杂度为o(1)
当str的字符串长度大于256时
复杂度为o(n)
qiucp 2008-04-07
  • 打赏
  • 举报
回复


bool HaveSameChar(char *pstr)
{
char *p1 = pstr;
char *p2 = NULL;
while (*p1 != '\0')
{
p2 = p1;
while (*p2 != '\0')
{
p2++;
if (*p2 == *p1)
{
return true;
}
}
p1++;
}
return false;
}
sheenl 2008-04-07
  • 打赏
  • 举报
回复
复制到临时串. 把临时串排序, 逐逐字符检查和下一个字符是否相同. 应该是O(NlgN)的速度?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧