现在的位置: 首页 > 综合 > 正文

关于删除字符串中重复字符问题?解析

2014年01月15日 ⁄ 综合 ⁄ 共 851字 ⁄ 字号 评论关闭

无意间听到朋友说起这个小问题,就稍微研究一下,大概整理两种方法:

(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;
}

抱歉!评论已关闭.