判断字符串的字符是否只出现一次

来源:互联网 发布:网页数据分析 编辑:程序博客网 时间:2024/06/05 23:02

题目:来自脑客爱刷题  

给定一个字符串str,判断字符串中是否所有字符都只出现过一次。
例如:
str: “abc”
返回true

str: “1231″
返回false

方法一:时间复杂度O(N)

bool IsUnique(string str){if(str.empty())return false;bool mark[256]={false};for(int i=0;i<str.size();i++){if(mark[str[i]])return false;mark[str[i]]=true;}return true;}

方法二:额外空间复杂度O(1),并有尽可能低的时间复杂度。本方法的时间复杂度是O(nlogn)。

//注意不能遗漏地址传递的 “&”,largest表示有效下标的最大值void HeadFixDown(string &str,int i,int largest){while(2*i+1<=largest){int child=2*i+1;if(2*i+2<=largest) child=str[2*i+2]>str[child]?2*i+2:child;if(str[i]<str[child]){swap(str[i],str[child]);/*char temp=str[i];str[i]=str[child];str[child]=temp;*/i=child;}elsebreak;}}bool IsUnique2(string &str){if(str.empty())return false;//生成堆int len=str.size();for(int i=str.size()/2-1;i>=0;i--){HeadFixDown(str,i,len-1);}cout<<str<<endl;//堆排序for(int i=len-1;i>=1;i--){swap(str[0],str[i]);HeadFixDown(str,0,i-1);//注意i-1}//判断有没有重复for(int i=1;i<len;i++){if(str[i]==str[i-1])return false;}return true;}


0 0
原创粉丝点击