判断字符数组中是否所有的字符只出现了一次(左程云)非递归堆排序实现

来源:互联网 发布:奥米姿淘宝 编辑:程序博客网 时间:2024/06/04 22:46

【题目】

  给定一个字符类型数组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;}


阅读全文
0 0
原创粉丝点击