亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查字符串中是否存在字符集 - 改進

檢查字符串中是否存在字符集 - 改進

慕碼人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 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號