为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人2483693 2023-02-16 15:41:37
如果两个英语单词只包含相同的字母,则它们是相似的。例如,food 和 good 不相似,但 dog 和 good 相似。(如果 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 lovee volvell lover  levo loved love lovee 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 是否适用解决方案?
查看完整描述

5 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

由于只有 26 个字母,而 an 中有 32 位int,因此 anint足以容纳有关单词中出现的字母的所有信息:


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

}


查看完整回答
反对 回复 2023-02-16
?
杨魅力

TA贡献1811条经验 获得超6个赞

我建议简化正则表达式,不需要前瞻,简单的“^[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-02-16
?
HUH函数

TA贡献1836条经验 获得超4个赞

数 10 应该成功!


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


Predicate<Character> p = x -> s.indexOf(x) > -1 ? true : false;


List<String> asList = Arrays.asList(arr);


asList.stream().forEach(x -> {

    List<Character> chars = new ArrayList<>();

    for (int i = 0; i < x.length(); i++) {

        chars.add(x.charAt(i));

    }

    boolean anyMatch = chars.stream().allMatch(p);

    if (anyMatch)

        count++;

});


System.out.println(count);


查看完整回答
反对 回复 2023-02-16
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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


    Set<Character> searchWordCharacters = getDistinctCharacters(s);

    long result = Stream.of(arr)

            .map(Scratch::getDistinctCharacters)

            .filter(wordCharacters -> wordCharacters.size() == searchWordCharacters.size())

            .filter(wordCharacters -> wordCharacters.containsAll(searchWordCharacters))

            .peek(System.out::println)

            .count();

    System.out.println(result);

}


private static Set<Character> getDistinctCharacters(String word) {

    return word.chars()

            .mapToObj(i -> (char) i)

            .collect(Collectors.toSet());

}

结果:10


查看完整回答
反对 回复 2023-02-16
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

我只计算了 10 个应该成功的,无论是在我的实施中还是在我手动检查时。


很简单,就是比较每个单词中的字母集合是否相等


public static void main(String... args)

{

    String word = "love";

    List<String> strs = Arrays.asList(

        "velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",

        "lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"

    );


    System.out.println(

        strs.stream()

           .filter(str -> chars(word).equals(chars(str)))

           .count()

    );

}


private static Set<Character> chars(String word)

{

    return word.chars()

        .mapToObj(ch -> (char) ch)

        .collect(Collectors.toSet());

}


查看完整回答
反对 回复 2023-02-16
  • 5 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信