**题目要求:请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个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);
}