题目:
判定字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
思路:
可以使用二进制位记录,这样效率比较高
1.代码如下 IsUnique.java:
package com.yuhl.right.leetcode;
/**
* @author yuhl
* @Date 2020/10/25 7:31
* @Classname IsUnique
* @Description
* 判定字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
*
* 示例 1:
* 输入: s = "leetcode"
* 输出: false
*
* 示例 2:
* 输入: s = "abc"
* 输出: true
* 限制:
*
* 0 <= len(s) <= 100
* 如果你不使用额外的数据结构,会很加分。
*/
public class IsUnique {
public static void main(String[] args) {
String a = "abc";
boolean unique = isUnique(a);
System.out.println(unique);
}
public static boolean isUnique(String astr) {
//既然不使用其他数据结构,那么HashMap\list\array就都不使用了。可以使用位运算。
//ascii 2^7=128位(留一位校验位),一个long是8个字节,8*8=64位,可以使用2个long类型即128位来代替。
//默认位0 如果一次,就把相应位上置一。详细代码如下:
long hightbit = 0L;//00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
long lowbit = 0L;//00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
for(char c :astr.toCharArray()){
if(c>=64){//0-63在低位中
long highttmp = 1L << (c - 64);//1L = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
if((hightbit & highttmp) != 0){//说明相同位置上有相同的1,即出现过。
return false;
}
hightbit |= highttmp ;//hightbit = hightbit |highttmp;//把highttmp中相应位置上的1移动到hightbit相应位置上
}
}
for(char c :astr.toCharArray()){
if(c<64){//0-63在低位中
long lowtmp = 1L << c;//1L = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
if((lowbit & lowtmp) != 0){//说明相同位置上有相同的1,即出现过。
return false;
}
lowbit |= lowtmp ;//hightbit = hightbit |highttmp;//把highttmp中相应位置上的1移动到hightbit相应位置上
}
}
return true;
}
}
2.执行结果:
"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe"
true