//判断字符数组中是否所有的字符都只出现过一次
public class isStringUnique{
//时间复杂度O(n)的方法
public static boolean isUnique01(char[]chas)
{
if(chas==null)
{
return false;
}
boolean []map=new boolean[127];
for(int i=0;i<chas.length;i++)
{
if(map[chas[i]])
{
return false;
}
map[chas[i]]=true;
}
return true;
}
//额外空间为O(1)的算法(采用堆排序后由后向前面查找)
public static boolean isUnique02(char[]chas)
{
if(chas==null)
{
return false;
}
heapsort(chas); //堆排序
for(int i=1;i<chas.length;i++)
{
if(chas[i]==chas[i-1])
{
return false;
}
}
return true;
}
//堆排序
public static void heapsort(char[]chas)
{
//建堆过程
for(int i=0;i<chas.length;i++)
{
heapinsert(chas,i);
}
for(int i=chas.length-1;i>0;i--)
{
swap(chas,0,i);
heapify(chas,0,i);
}
}
//建堆
public static void heapinsert(char[]chas,int i)
{
int parent=0;
while(i!=0)
{
parent=(i-1)/2;
if(chas[parent]<chas[i])
{
swap(chas,parent,i);
i=parent;
}else{
break;
}
}
}
//两个字符串的交换
public static void swap(char[]chas,int index1,int index2)
{
char temp=chas[index1];
chas[index1]=chas[index2];
chas[index2]=temp;
}
public static void heapify(char[]chas,int i,int size)
{
int left=i*2+1;
int right=i*2+2;
int largest=i;
while(left<size)
{
if(chas[left]>chas[i])
{
largest=left;
}
if(right<size&&chas[right]>chas[largest])
{
largest=right;
}
if(largest!=i)
{
swap(chas,largest,i);
}else
{
break;
}
i=largest;
left=i*2+1;
right=i*2+2;
}
}
public static void main(String[]args)
{
char[]chas={'a','b','c'};
char[]cha2={'1','2','1'};
System.out.println(isUnique01(chas));
System.out.println(isUnique01(cha2));
System.out.println(isUnique02(cha2));
System.out.println(isUnique02(chas));
}
}