给定一个字符串,去除整个字符串中重复的字符

这篇博客探讨了如何在不允许和允许使用额外存储空间的情况下,有效地去除字符串中的重复字符。对于不允许使用额外空间的情况,提供了两种策略:后处理和前处理,其中前处理方法的时间复杂度为O(k*n),k为不同字符的总数。而在允许使用额外空间时,可以通过标记数组或位操作来实现,当字符限制在'a-z'之间,一个整型变量就能解决问题。

该题与我前面的一篇博客判断一个字符串是否是唯一的很相似。可以分两种情况来讨论:1、不许使用额外的存储空间;2、可使用额外的存储空间

s表示待处理的字符串,l表示当前非重复字符的个数

1、不许使用额外的存储空间

对每个待处理的字符,可以考虑在后处理和在前处理

在后处理:对每个待处理的字符,假设为c,从该字符的后一个字符开始,直到字符串的末尾,如果有字符与c相同,就将该位置的字符标记为无效,处理完毕后,将c存在到s中的l位置上。

在前处理:对每个待处理的字符,假设为c,将c与s中的第0---(l-1)个字符相比较,如果有相同的,则处理c后面的一个字符;如果没有相同的,就将c存放到s的第l个位置上,然后在处理c后面的一个字符。

上述两种方法中第一种的时间复杂度为O(n*n),第二种的时间负载读为O(k*n),k为不同字符的总数,第二种方法的代码如下:

void removeDuplicateChar(char s[])
{
    int i, j;
    int length = strlen(s);
    if(length < 2)
        return;

    int last = 1;
    /*s[i]每次都是与前last不重复的字符相比较*/
    for(i = 1; i < length; i++)
    {
        for(j = 0; j < last; j++)
        {
            if(s[i] == s[j])
                break;
        }
        if(j == last)
            s[last++] = s[i];
    }
    s[last] = '\0';
}


2、允许使用额外的存储空间

当可以使用额外的存储空间时,若可以使用较大的数组,例如char flag[256],数组中的每一个元素用来标记一个字符,在处理字符串时就先判断它在flag对应位置上的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值