无意间听到朋友说起这个小问题,就稍微研究一下,大概整理两种方法:
(1)遍历整个字符串,使用两个for循环,比较字符串中前后两个字符是否相同,
若相同则设置标记(比如置为(0);然后将遍历后数组中非0元素输出既可以;
时间复杂度O(n^2),空间复杂度O(1)
(2)仅需要一次遍历,通过辅助数组记录字符串中字符是否为第一次出现,
若为第一次则对应元素值为0,并记录该字符,否则跳过不予记录;
时间复杂度为线性,但需要申请额外空间(辅助数组)
下面简单介绍第二种方法:(有问题在所难免,欢迎大家指正)
#include <iostream>
using namespace std;
char* DelRepeat(char *str)
{
int len = strlen(str);
char *c = new char(len+1);
strcpy(c,str);//拷贝str,以对其副本进行修改
int i,j;
char f[128]={0}; //申请128个char类型大小空间,赋初值为0;用于标记字符串中某一字符第一次出现
for(i=0,j=0; c[i]; ++i)
{
if(f[c[i]]==0) //若某一字母标记位非0,则表明之前已经记录过,不再记录
{
f[c[i]]=1; //字母c[i]第一次出现,置标记位为1,且记录其值
c[j++]=c[i];
}
}
c[j] = '\0';//结束符
str = c; //将修改有的副本赋值给原始常量字符串指针
return str;
}
int main()
{
char *c ="abcddfdfdwwwaaa,.;;,,,!shj4~";
c = DelRepeat(c);
cout << c <<endl;
return 0;
}