// O(N)-没有其他数据结构...
private boolean isUniqueWithoutDS(String str){
boolean value = true;
int checker = 0;
for (int i = 0; i < str.length(); i++) {
int c = str.charAt(i) - 'a';
System.out.println("checker is : " + checker);
System.out.println("1<<c is " + (1<<c));
if((checker & (1 << c))>0){
value = false;
break;
}
checker = checker | 1<<c;
}
return value;
}
这是我的代码,可以正常工作,我无法理解它对于大写和小写字母组合字符串的工作方式。例如,“ Zizu
”有效。对于所有小字母字符串,它都有效,我也知道它的工作原理。
答案 0 :(得分:2)
好吧,答案可能取决于语言,但使用Java(JLS 15.19. Shift Operators):
如果左侧操作数的提升类型为
int
,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值&
(0x1f
)的按位逻辑AND运算符0b11111
(§15.22.1)一样。因此,实际使用的移位距离始终在0
至31
范围内。
因此,就像执行c = c & 0x1f
或c = c % 32
一样,因此大写A
和小写a
都将成为{{1 }},用于c
运算符。
我假定对于32位0
类型,其他语言也可能类似地工作。
答案 1 :(得分:2)
检查字符串是否包含所有唯一字符的另一种方法-在 O(N)中:
检查每个第i个字符是否等于第j个字符
3.1如果[第i个字符==第j个&& i!= j字符],则中断循环,因为字符串包含重复的字符。 (i!= j表示与相同的字符进行比较)
3.2递减j并将j设置为n-1且i + = 1,当j = 0 [这部分很棘手]
重复步骤3,除非我变成第n-1个大小
代码
String s = "abcde";
int i = 0;
int j = s.length()-1;
boolean flag = true;
while(true) {
if(i == s.length()-1)
break;
// DUPLICATE FOUND
if(i != j && s.charAt(i) == s.charAt(j)) {
flag = false;
break;
}else {
j--;
// COMPARING DONE AGAINST i-TH CHAR TO ALL OTHER CHARS, INCREMENT i NOW
if(j == 0) {
j = s.length()-1;
i += 1;
}
}
}
if(flag)
System.out.println("unique");
else
System.out.println("non-unique");
答案 2 :(得分:0)
我建议使用大小为256的数组存储每个字符的计数(假设有256个可能的字符),该计数在循环开始时设置为值0。然后,在获取每个下一个字符时,只需简单地增加每个位置。最后,有一个快速的技巧可以检查该位置的值是0还是1(例如p != q
。如果if语句freq[i] == !!freq[i])
是应该对数组中的所有256个条目都适用的语句。
已更新:
[freq[i] == !!freq[i]]