判断字符数组中是否所有的字符都只出现过一次

//判断字符数组中是否所有的字符都只出现过一次
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));

	}
    	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值