题目描述
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个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的哈姆雷特。真的牛。