请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
方式三:基于快速排序的partition,可以边排序边找重复,也即是每次partition之后,判断中间key元素与两边元素是否相同,相同则返回false,不同再进行下一轮partition.时间复杂度也是O(nlongn)
#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
//方式一
/*bool CheckDifferent(string iniString)
{
unsigned char str[256] = { 0 };
for (int i = 0; i < iniString.length(); ++i)
{
str[iniString[i]]++;
}
for (int i = 0; i < iniString.length(); ++i)
{
if (str[ iniString[i] ] > 1)
return false;
}
return true;
}*/
//方式二
/*bool CheckDifferent(string iniString)
{
sort(iniString.begin(),iniString.end());
if (unique(iniString.begin(),iniString.end()) == iniString.end() ) //去掉重复的元素,这里的去掉是将重复元素放在容器的末尾,伪去除,返回第一个重复的元素的迭代器,没有重复的元素返回end位置。
return true;
return false;
}
*/
//方式三
bool Qsort(string str,int low,int high)
{
if (low >= high)
return true;
int second = high;
int first = low;
int key = str[high];
while (low < high)
{
while (low < high && str[low] <= key)
{
low++;
}
swap(str[low],str[high]);
while (low < high && str[high] >= key)
{
high--;
}
swap(str[low],str[high]);
}
if (low != first && str[low] == str[low-1])
return false;
if(low != high && str[low == str[low+1]])
return false;
return Qsort(str,first,low-1) && Qsort(str,low+1,second);
}
bool CheckDifferent(string iniString)
{
return Qsort(iniString,0,iniString.length()-1);
}
int main()
{
cout << CheckDifferent("aeiou") <<endl;
cout << CheckDifferent("BarackObama") <<endl;
cout << "hello..."<<endl;
return 0;
}