Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到至少一次包含所有给定字符的单词_Java - Fatal编程技术网

Java 如何找到至少一次包含所有给定字符的单词

Java 如何找到至少一次包含所有给定字符的单词,java,Java,我正在使用这个代码 while((dictionaryWord = br_.readLine()) != null) { if(dictionaryWord.matches("^"+word.replace("*" , "." )+"$")) { incrementCounter();

我正在使用这个代码

                   while((dictionaryWord = br_.readLine()) != null) 
            {
                if(dictionaryWord.matches("^"+word.replace("*" , "." )+"$"))
                {   
                    incrementCounter();
                    System.out.println(dictionaryWord);
                }
            }
所需目标:word=dgo

输出:狗、上帝、教条巨怪等等……

您可以在
word
中构建一个包含所有字符的列表,并对其进行迭代。如果一个字符不在
dictionaryWord
中,则
dictionaryWord
不适合。仅当全部显示时-打印
dictionaryWord

    String word = "dog";
    String  dictionaryWord;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while((dictionaryWord = br.readLine()) != null)  {
        Set<Character> chars = new HashSet<Character>();
        for (char c : word.toCharArray()) {
            chars.add(c);
        }
        boolean match = true;
        for (Character c : chars) {
            String s = "" + c;
            if (!dictionaryWord.contains(s)) {
                match = false;
                break;
            }
        }
        if (match == true) 
            System.out.println(dictionaryWord);
    }
使用来自ApacheCommons的

可以构建一个包含word中所有字符的。如果一个字符不在
dictionaryWord
中,则
dictionaryWord
不适合。仅当全部显示时-打印
dictionaryWord

    String word = "dog";
    String  dictionaryWord;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while((dictionaryWord = br.readLine()) != null)  {
        Set<Character> chars = new HashSet<Character>();
        for (char c : word.toCharArray()) {
            chars.add(c);
        }
        boolean match = true;
        for (Character c : chars) {
            String s = "" + c;
            if (!dictionaryWord.contains(s)) {
                match = false;
                break;
            }
        }
        if (match == true) 
            System.out.println(dictionaryWord);
    }
public static void main(String[] args) {
  final BitSet reqChars = new BitSet(26);
  for (char c : "dog".toCharArray()) reqChars.set(Character.toLowerCase(c) - 'a');
  for (String w : new String[] {"god", "dogma", "megalogdon", "dorm"})
    if (hasAllChars(w, reqChars)) System.out.println(w);
}

public static boolean hasAllChars(String in, BitSet req) {
  req = (BitSet)req.clone();
  for (char c : in.toCharArray()) {
    req.set(Character.toLowerCase(c) - 'a', false);
    if (req.isEmpty()) return true;
  }
  return false;
}
使用来自apache commons的公共静态布尔字符(字符串字、集合字符){
public static void main(String[] args) {
  final BitSet reqChars = new BitSet(26);
  for (char c : "dog".toCharArray()) reqChars.set(Character.toLowerCase(c) - 'a');
  for (String w : new String[] {"god", "dogma", "megalogdon", "dorm"})
    if (hasAllChars(w, reqChars)) System.out.println(w);
}

public static boolean hasAllChars(String in, BitSet req) {
  req = (BitSet)req.clone();
  for (char c : in.toCharArray()) {
    req.set(Character.toLowerCase(c) - 'a', false);
    if (req.isEmpty()) return true;
  }
  return false;
}
int i=0; int wordLength=word.getLength(); 而(i
publicstaticboolean)包含所有字符(字符串字、集合字符){
int i=0;
int wordLength=word.getLength();

然而(实际上,这个问题最有趣的部分是如何避免查看字典中的每个单词(尽管原始代码有点掩盖了这一点)。一个潜在的有趣答案是:

  • 按出现频率列出26个字符的表格
  • 查找每个字符,获取最不频繁出现的字符
  • 然后对包含该字符的单词进行匹配
  • 当然,这是假设单个匹配比正则表达式便宜


    这是一个非常棒的维基百科页面。在这种情况下,差异可能不会很大,但在某些方面,例如e和x,它会很大。

    事实上,这个问题最有趣的部分是如何避免查看字典中的每个单词(尽管原始代码有点掩盖了这一点)。一个可能有趣的答案是:

  • 按出现频率列出26个字符的表格
  • 查找每个字符,获取最不频繁出现的字符
  • 然后对包含该字符的单词进行匹配
  • 当然,这是假设单个匹配比正则表达式便宜



    关于这个主题的很棒的维基百科页面。在这种情况下,差异可能不会很大,但在一些有e和x的东西上,它会很大。

    如果输入是“好的”,应该是“狗”吗是否在输出中?是否会有重音字符,或者在@MarkByers之外的字符?是的,只要每个字符至少存在once@MarkByers只有英文字母表中的26个字母我确信有一个正则表达式可以做到这一点,但是你可以始终在所有
    字符的
    indexOf
    循环中包含
    在所需的单词中。如果输入是“好”怎么办?应该是“狗”是否在输出中?是否会有重音字符,或者在@MarkByers之外的字符?是的,只要每个字符至少存在once@MarkByers只有英文字母表中的26个字母我确信有一个正则表达式可以做到这一点,但是你可以始终在所有
    字符的
    indexOf
    循环中包含
    你能举个例子吗possible@stackoverflow:只提供了一个从System.in读取并与“dog”匹配的代码,您可以将其签出。@stackoverflow:我还添加了另一种更有效的方法。您不需要
    CollectionUtils
    set2.Retainal(set1);if(set1.equals(set2))…
    也会达到同样的效果。@MarkoTopolnik:是的,编辑了评论-我第一次读时误解了你。OP明确要求26个字符,所以是关于回答一个特定的问题-而不是一般情况…所以对于这个特定的问题,
    int
    的解决方案是尽可能快的。你能给出这个例子吗?谢谢ssible@stackoverflow:只提供了一个从System.in读取并与“dog”匹配的代码,您可以将其签出。@stackoverflow:我还添加了另一种更有效的方法。您不需要
    CollectionUtils
    set2.Retainal(set1);if(set1.equals(set2))…
    也会达到同样的效果。@MarkoTopolnik:是的,编辑了评论-我第一次读时误解了你。OP显然要求26个字符,所以是关于回答一个特定的问题-而不是一般情况…所以对于这个特定的问题,
    int
    解决方案是尽可能快的。这是一个糟糕的解决方案,因为你去了未命中后的单词结尾。假设您有一个20个字符的单词,而第二个未命中。这是5%的效率。@Rob您误解了我的代码。我的集合包含所需的字符。输入单词允许包含所需字符集合之外的字符,这不是未命中。是的,名称有误导性。hasAllChars将暗示字符串将被忽略包含所有字符。我在回答中做了一个版本。@Rob它的内容是“in有req的所有字符”这就是它所做的。这是一个糟糕的解决方案,因为您在未命中一个字符后就转到了单词的末尾。假设您有一个20字符的单词,而第二个未命中。这是5%的效率。@Rob您误解了我的代码。我的集合包含所需的字符。允许输入单词包含所需字符集之外的字符,这不是未命中。是的,名称有误导性。hasAllChars表示字符串将包含所有字符。我在回答中做了一个版本。@Rob它读“in has all chars of req”,它就是这样做的。我认为这不正确。输入“dogma”和字符集“ogd”会发生什么当你到达“m”时?是的,我看到了@Marko的解决方案,并提供了他的方法的实现。我将修改我的答案。我认为这不正确。当你到达“m”时,输入“dogma”和字符集“ogd”会发生什么?是的,我看到了@Marko的解决方案,并提供了他的方法的实现。我将修改我的答案。