当前位置: 首页 > 知识库问答 >
问题:

检查字符串中是否存在字符集-改进

唐阳泽
2023-03-14

如果两个英语单词只包含相同的字母,则它们是相似的。例如,食物和好东西并不相似,但狗和好东西是相似的。(如果A与B相似,则A中的所有字母都包含在B中,B中的所有字母都包含在A中。)

给定一个单词W和一个单词L列表,查找L中与W相似的所有单词。将字数打印到标准输出。

例子:

输入(标准输入):

love
velo low vole lovee volvell lowly lower lover levo loved love lovee lowe lowes lovey lowan lowa evolve loves volvelle lowed love

输出(标准输出):

14

说明:

L中与love相似的词是:velo vole love volvell lover levo love love lovey evolve loves volvelle love

总计14个。

因此,我目前的解决方案如下:

 public static void main(String[] args) {
    String[] arr = new String[]{"velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",
            "lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"};
    String s = "love";
    int result = 0;

    Pattern p = Pattern.compile(buildPattern(s));

    for (String val : arr) {
        if (p.matcher(val).find()) result++;
    }

    System.out.println(result);
}

private static String buildPattern(String s) {
    String pattern = "^";
    for (int i = 0; i < s.length(); i++) {
        pattern += "(?=.*" + s.charAt(i) + ")";
    }
    return pattern;
}

我想知道我的简单代码是否有任何改进。

Aho Corasick是否适用于解决方案?

共有3个答案

郭凡
2023-03-14

我会尽量避免为此使用正则表达式,并会自己检查字母。

public static void main(String[] args)
{
  String[] arr = new String[]{"velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",
          "lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"};
  String s = "love";
  int result = 0;

  for (String word : arr)
  {
    if (isSimilar(s, word))
    {
      result++;
    }
  }

  System.out.println(result);
}

private static boolean isSimilar(String word, String test)
{
  for (char c : test.toCharArray())
  {
    if (word.indexOf(c) == -1)
    {
      return false;
    }
  }
  return true;
}

虽然目前我上面的例子只返回10

苏涛
2023-03-14

我建议简化正则表达式,不需要前瞻,简单的“^[love]*$”就可以了。

private static String buildPattern(String s) {
    String pattern = "^[";
    for (int i = 0; i < s.length(); i++) {
        pattern += s.charAt(i);
    }
    pattern += "]*$";
    return pattern;
}
淳于禄
2023-03-14

由于只有26个字母,而int中有32位,因此int足够大,可以保存有关单词中出现哪些字母的所有信息:

static int getFingerprint(String s)
{
    int result=0;
    for (int i = s.length()-1; i>=0; --i) {
        char c = s.charAt(i);
        if (c>='a' && c<='z')
            result |= 1<<(int)(c-'a');
        else if (c>='A' && c<='Z')
            result |= 1<<(int)(c-'A');
    }
    return result;
}

public static void main(String[] args) {
    String[] arr = new String[]{"velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",
        "lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"};
    String s = "love";

    int fingerprint = getFingerprint(s);

    int matches = 0;
    for (String item : arr) {
        if (getFingerprint(item)==fingerprint)
            ++matches;
    }
    System.out.println(matches);
}
 类似资料:
  • 问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案:

  • 问题内容: 我需要检查单词中是否存在元音。如果是这样,应对“说”一词进行操作。我想避免for循环,因为我想到了这一点: 请推荐一种执行时间成本较低的方法。另外,也请帮助我纠正上述方法。 问题答案: vowels = {“a”, “e”, “i”, “o”, “u”, “A”, “E”, “I”, “O”, “U”} if any(char in vowels for char in word):

  • 问题内容: 我之前已经找到了这个问题的一些答案,但是对于当前的Python版本似乎已经过时了(或者至少它们对我不起作用)。 我想检查子字符串是否包含在字符串列表中。我只需要布尔结果。 我找到了这个解决方案: 我希望从这段代码中得到一个价值。如果单词是“ der”,则输出应为。 但是,结果是一个生成器函数,我找不到找到该值的方法。 任何想法? 问题答案: 您可以导入从的情况下,它是由一些其他的替代:

  • 问题内容: 如何检查数组中的任何字符串是否在另一个字符串中? 喜欢: 该代码行不通,只是为了展示我想要实现的目标。 问题答案: 你可以使用: 同样,要检查是否找到了列表中的所有字符串,请使用all代替any。

  • 问题内容: 我正在使用Python v2,并且试图找出是否可以判断字符串中是否包含单词。 我发现了一些有关识别单词是否在字符串中的信息-使用.find,但是有一种方法可以执行IF语句。我想要以下内容: 谢谢你的帮助。 问题答案: 出什么问题了:

  • 编辑:如何让js检查字符串是否包含数组的任何字符串,如var arrayVar=[“bing”,“google”];如果像“google是最好的吗?”这样的字符串,请检查它是否包含数组中的内容。这可能吗?