检查字符串是否包含所有唯一字符

时间:2019-08-19 23:12:56

标签: java string algorithm

// 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”有效。对于所有小字母字符串,它都有效,我也知道它的工作原理。

3 个答案:

答案 0 :(得分:2)

好吧,答案可能取决于语言,但使用Java(JLS 15.19. Shift Operators):

  

如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值&0x1f)的按位逻辑AND运算符0b11111(§15.22.1)一样。因此,实际使用的移位距离始终在031范围内。

因此,就像执行c = c & 0x1fc = c % 32一样,因此大写A和小写a都将成为{{1 }},用于c运算符。

我假定对于32位0类型,其他语言也可能类似地工作。

答案 1 :(得分:2)

检查字符串是否包含所有唯一字符的另一种方法-在 O(N)中:

  1. 使用无限循环
  2. 使用二变量i(i = 0)和j =(n-1 [n是字符串长度])
  3. 检查每个第i个字符是否等于第j个字符

    3.1如果[第i个字符==第j个&& i!= j字符],则中断循环,因为字符串包含重复的字符。 (i!= j表示与相同的字符进行比较)

    3.2递减j并将j设置为n-1且i + = 1,当j = 0 [这部分很棘手]

  4. 重复步骤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]]
相关问题