【问题标题】:Java repeated letter check in stringJava在字符串中重复的字母检查
【发布时间】:2016-07-06 01:48:21
【问题描述】:

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

例如:

  • 用户输入:巧克力
    程序输出:真

  • 用户输入:112 cream
    程序输出:False

【问题讨论】:

  • 我们需要看源码
  • 您可以使用 HashSet 来存储已出现的字母。
  • 提示:你可以通过调用Character.isLetter(ch)来判断一个字符是否是一个字母。
  • 这可能会为您指明正确的方向。使用正则表达式进行连续字母检测stackoverflow.com/a/13596720/683551

标签: java input letters-and-numbers


【解决方案1】:

这是另一个版本,基于 @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) 查找/插入,并且由于循环是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();
}

更新修复流版本中的错误

【讨论】:

    【解决方案2】:
    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;
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

          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
      

      【讨论】:

        【解决方案4】:

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

            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;
            }
        

        【讨论】:

          【解决方案5】:

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

          2.) 遍历数组以查看第 i 个值是否 == (i+1) 个值。如果找到,则返回 false。否则,返回真。

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

          空间复杂度:O(1)

          【讨论】:

            【解决方案6】:

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

            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;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-21
              • 1970-01-01
              • 2011-12-17
              • 1970-01-01
              • 2011-08-16
              相关资源
              最近更新 更多