【问题标题】:How do I find words that only contain/consist of a given char sequence如何找到仅包含/由给定字符序列组成的单词
【发布时间】:2012-05-20 23:52:49
【问题描述】:

我希望遍历字典文件并查找仅包含给定字符的单词

示例 dgo

想要的结果:狗,上帝

不包含(在其中)给定字符的单词

我正在使用以下代码:

            while((dictionaryWord = br_.readLine()) != null) 
            {   

                    if(dictionaryWord.contains(getWord()))
                        System.out.println(dictionaryWord);

            }

但这给了我所有包含给定字符的单词——不希望

【问题讨论】:

  • 您可能想看看this 教程。正则表达式会一次又一次地出现,了解它们可能是个好主意。
  • @Jeffrey 是的,我很熟悉它们。我想做这一切都是java
  • 你仍然会在 Java 中完成这一切,它内置了 regex library。(Oracle 的 regex tutorial。)
  • 我不确定它是否合适,但我添加了一个字谜标签。

标签: java anagram


【解决方案1】:

没有正则表达式:

public static boolean sameCharacters(String left, String right) {
    return sortCharacters(left).equals(sortCharacters(right));
}

private static String sortCharacters(String s) {
    final char[] chars = s.toCharArray();
    Arrays.sort(chars);
    return String.valueOf(chars);
}

更新:性能更好的版本(感谢 user384706):

public static boolean sameCharacters(String left, String right) {
    return Arrays.equals(sortCharacters(left), sortCharacters(right));
}

private static char[] sortCharacters(String s) {
    final char[] chars = s.toCharArray();
    Arrays.sort(chars);
    return chars;
}

【讨论】:

  • 拥有:char[] sortCharacters(String s) 并比较 char [] 而不是创建新的 String 并执行 equal 不是更好吗?
  • @JamesPoulson: String.valueOf(chars)chars 数组进行不必要的内部复制,以确保 String 保持不变。
  • 难道不可以通过避免排序来进一步提高性能吗?我认为应该可以编写一种方法来使用 HashTable 比较字符。与使用排序的平均案例复杂度 O(NlogN) 相比,这将具有 O(N) 复杂度。
  • @MartinPrakash:理论上:是的。但是对于短字符串(如单个单词),HashSet 的成本可能太大了。随意发布您的解决方案并做一些基准测试,这可能会很有趣。
【解决方案2】:

你可以通过做检查

if (word.matches("[dgo]*")) {
    ...
}

【讨论】:

  • 好方法。在我看来,我会更改 * 为 + 以避免空字符串。
  • 会不会不匹配 ddd, ggg 这不是需要找到的东西
  • @TiagoPeczenyj,对我来说似乎违反了规范,因为空字符串不包含任何不允许的字符。
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多