确定字符互异

题目描述

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。

测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False

因为不能用额外的存储空间,所以不能这么做。

import java.util.*;


public class Different {
    public boolean checkDifferent(String iniString) {
       	char a;
       	boolean is = false;
        Map<String,Integer> table =  new HashMap<String, Integer>();
       	for( int i =0;i<iniString.length();i++){
           a = iniString.charAt(i);
           for(String c : table.keySet()){
        	   if( c.charAt(0) == a ){
        		   is = true;
        	   }
           }
           if( !is ) table.put(a+"", 1);
           else{
        	   return false;
           }
       }
       return true;
    }
}

因为要使用ASC码所以根据抽屉原理,当字符串长度大于256时,必然是有重复的。对剩下的256个字符进行双重循环,复杂度为O(n*n)因为n最大为256,所以还可以接受。在这里用异或代替==效率更高点。

import java.util.*;

public class Different {
        
    public boolean checkDifferent(String iniString) {
       	if(iniString.length() > 256){
       		return false;
       	}
       	char[] a = iniString.toCharArray();
       	for(int i=0;i<a.length;i++){
       		char b = a[i];
       		for (int j = i+1; j < a.length; j++) {
       			if( b == a[j]) return false;
			}
       	}
       	return true;
    }
}
还有看到比较厉害的大神用正则表达式:

public boolean checkDifferent(String iniString) {   
return !iniString.matches(".*(.)(.*\\1).*");
}


真的发现,1000个人心中有1000的哈姆雷特。真的牛。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值