判断一个字符串里面是否有重复的字符

**题目要求:请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。**
第一种解法:看到这道题目大家的第一想法就是判断字符串的长度是不是大于256,大于256那么一定是会有重复的字符,不然的话两个for循环,看看比较一下就行了,这样的算法时间复杂度是n*n (n<256)是一个常数,看起来效率也不差下面贴代码:

bool checkDifferent(string iniString) {
        int len=iniString.length();
        bool isDiff=true;
        if(len>256)
            return false;
        for(int i=0;i<len;i++)
        {
            for(int j=i+1;j<len;j++)
            {
                if(iniString[i]==iniString[j])
                {
                    isDiff=false;
                    break;
                }
            }
        }

        return isDiff;
    }

第二种方法:由于一共只有256个字符,所以完全可以创建一个长度为256的int数组每一个存储出现字符的ASCII码,只要每次把出线的字符递增就可以了,随后判断存储的是不是大于1,是直接返回false,只需要一个for循环就可以了,这种方法的时间效率比第一种要高,因为它不用遍历所有的字符,代码如下:

bool checkDifferent(string iniString) {
        int a[256] = {0};
        int len = iniString.length(), i;
        if(len > 256)
            return false;
        for(i = 0; i < len; i ++)
        {
            int x = iniString[i];
            a[x] ++;
            if(a[x] > 1)
                return false;
        }
        return true;
    }

第三种方法:可以采用边排序边比较的方法,就是一边快速排序一遍比较key与两边的元素是不是相同的,这种方法不是特别的好,但是比单纯的排序比较妖快很多

bool quick_check(string &str,int low,int high){
        int first = low,last = high;
        if (high-low>256)
            return false;
        char key = str[first];
        if (low>=high)
            return true;
        while(first<last){
            while(first <last && str[last] >= key)
                last--;            
            str[first] = str[last];
            while(first<last && str[first] <= key)
                first++;
            str[last] = str[first];
        }
        str[first] = key;
        if (first>low && str[first] == str[first-1])
            return false;
        if (first<high && str[first] == str[first+1])
            return false;
        return quick_check(str,low,first-1) && quick_check(str,first+1,high);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值