【题目】
给定一个字符类型数组chas,判断chas中是否所有的字符都只出现过一次。
【基本思路】
一.时间复杂度为O(N)的算法。
使用哈希表,记录每个字符出现的频数,如果发现字符的频数不为1,直接返回False。
二.时间复杂度为O(NlogN),空间复杂度为O(1)的算法。
1.先将数组排序,再判断当前字符是否等于前一个字符即可。
2.关键使用什么样的排序算法,满足复杂度要求的算法只有非递归版的堆排序。
C++版本:
#include<iostream>
#include<string>
using namespace std;
//以插入的形式构建堆
void heapInsert(string& s,int i){
int parent=0;
while(i)
{
parent=(i-1)/2;//找到父节点
if(s[parent]>=s[i])
break;
swap(s[parent],s[i]);
i=parent;
}
return ;
}
//堆排序,将堆顶与最后一个元素互换后调整堆的调整函数
void heapify(string &s,int i,int length){
//调整堆
int left=i*2;
int right=i*2+1;
int largest=i;
while(left<length)
{
if(s[left]>s[i])
largest=left;
if(right<length&&s[right]>s[largest])
largest=right;
if(largest==i)
break;
else
swap(s[largest],s[i]);
left=largest*2;
right=largest*2+1;
}
}
void heapsort(string& s){
for(int i=0;i<s.size();i++)
{
heapInsert(s,i);
}
for(int i=s.size()-1;i>0;i--)
{
swap(s[0],s[i]);//将堆顶与最后一个元素互换
heapify(s,0,i);
}
return ;
}
bool isUnique(string& s){
int n=s.size();
if(n==0) return false;
heapsort(s);
for(int i=1;i<s.size();i++)
{
if(s[i]==s[i-1])
return false;
}
return true;
}
int main(){
string s;
while(cin>>s;){
cout<<(isUnique(s)?"Yes":"No")<<endl;
}
system("pause");
return 0;
}