Java 字符串中的重复字母检查

Java repeated letter check in string

我在弄清楚如何检查用户输入的重复字母时遇到了问题。程序需要输出重复的字母为真,如果没有则为假。程序不应计算重复的数字或符号。

例如:

试试这个:

    String username ;
    char[] x = username.toCharArray();
    boolean duplicates=false;
    for (j=0;j<x.length;j++)
      for (k=j+1;k<x.length;k++)
        if (x[k] == x[j])
          duplicates=true
private static boolean check(String input) {
    Set<Character> tmp = new HashSet<Character>();
    for(char ch : input.toCharArray()) {
        if (Character.isLetter(ch) && !tmp.add(ch)) {
            return true;
        }
    }
    return false;
}

这是另一个版本,基于 @rell 的回答,但没有 HashSetchar[] 创建。

private static boolean check(String input) {
    for (int i = 0; i < input.length(); i++) {
        char ch = input.charAt(i);
        if (Character.isLetter(ch) && input.indexOf(ch, i + 1) != -1) {
            return true;
        }
    }
    return false;
}

对于较小的输入字符串,这很可能因此会更快。但是对于更长的输入字符串,@rell 的版本可能更快,因为他使用 HashSetO(1) lookup/insert,并且由于循环是 O(n),因此总数是 O(n)。我的解决方案是 O(n^2)(循环 O(n) 乘以 indexOfO(n)),最坏情况下的输入是这样的 abcdefghijklmnopqrstuvwxyzz.

更新另一个带流的版本。

private static boolean check(String input) {
    IntStream characters = input.codePoints().filter(Character::isLetter);
    return characters
            .distinct()
            .count() == characters.count();
}

更新 修复流版本中的错误

我们可以用这个减少到单循环。

    boolean checkDuplicates(char[] x)
    {
     Set<char> xSet = new HashSet<char>();
       for (char c : x)
       {
        if (xSet.contains(c)) return true;
        xSet.add(i);
       }
     return false;
    }

1.) 对字符数组进行排序。

2.) 遍历数组以查看是否第 i 个值 == (i+1)th value。如果找到,return 错误。否则,return 为真。

时间复杂度:O(nlogn)(用于排序)

Space 复杂度:O(1)

为了检查任何字母的重复次数是否超过限制次数,您可以使用以下方法:

public static boolean repeatedMoreThanLimitedLength(String str, int limitLength) {
    Pattern pattern = Pattern.compile("(\w)\1+");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        if (matcher.group().length() >= limitLength)
            return true;
    }
    return false;
}