【问题标题】:Algorithm to find words that uses most letters that I have from the word list从单词列表中查找使用我拥有的大多数字母的单词的算法
【发布时间】:2021-10-18 11:24:15
【问题描述】:

我正在开发一款游戏,我需要一种算法来查找使用最多字母的单词。

可以用这些字母构成的L,A,B,K,C,O,L,N,A,E单词

ABACK ABLE ACNE ALACK ALAN ALBA ALEC ALOE ALONE ANAL ANKLE BAAL BACK BACON BAKE BAKE BALANCE BALE BALK BALL BALLON BANAL BANCO BANE BANK BEACON BEAK BEAN BECK BECKON BELL BLACK BLACKEN BLANK BLACK BLOCK BLOKE BOCK BONE BONE CABAL CABLE CAKE CALL CANAL CELL CLAN CLANK CLEAN CLOAK CLONE COAL COLE COLE COLE CONE EBON ELAN KALE KANA KANE KENO KNELL KNOB KNOLL LABEL LACE LACK LAKE LANCE LANE LANK LEAK LEAL LEAN LOAN LOBE LOCA LOCAL LOCALE LOCK LONE NALA NECK NOBLE NOEL OAKEN OCEAN OLLA ONCE

我需要一种算法来找到使用大多数字母的单词组合。字母可以使用一次。 我可以用蛮力算法找到它我可以取出一个单词并尝试用我留下的字母找到另一个单词。但我想构建更优雅的算法。

public class FindBetsWords {

    private static String wordsStr = "ABACK,ABAFT,ABATE,ABBA,ABBE,ABBOT,ABET,ABLAZE,ABLE,ABOUT,ACME,ACNE,ACTA,ACTUAL,ACUMEN,ACUTE,AFFABLE,AFFECT,AFLAME,AFLOAT,ALACK,ALAMO,ALAN,ALBA,ALBUM,ALBUMEN,ALEC,ALFA,ALLOT,ALMA,ALOE,ALOFT,ALONE,ALTO,ALUM,AMAZE,AMAZON,AMBLE,AMEN,AMOUNT,AMULET,ANAL,ANKLE,ANTE,ATOLL,ATOM,ATONE,AUNT,AUTO,BAAL,BABA,BABE,BABEL,BABU,BACK,BACON,BAFFLE,BAKE,BALANCE,BALBOA,BALE,BALEFUL,BALK,BALL,BALLET,BALLON,BALLOT,BALM,BANAL,BANCO,BANE,BANEFUL,BANK,BANTAM,BATE,BATEAU,BATMAN,BATON,BAUBLE,BEACON,BEAK,BEAM,BEAN,BEAT,BEAU,BECK,BECKON,BEFALL,BELL,BELT,BEMOAN,BENT,BETA,BLAB,BLACK,BLACKEN,BLAME,BLANK,BLANKET,BLAZE,BLAZON,BLEAK,BLEAT,BLENT,BLOC,BLOCK,BLOKE,BLOT,BLUE,BLUFF,BLUME,BLUNT,BOAT,BOATMAN,BOATMEN,BOCK,BOLE,BOLT,BOMB,BONE,BOULE,BOUNCE,BOUT,BUCK,BUCKET,BUCKLE,BUFF,BUFFALO,BUFFET,BULB,BULK,BULL,BULLET,BULLOCK,BUMBLE,BUNK,BUNT,BUTE,CABAL,CABLE,CABMAN,CABMEN,CAFE,CAKE,CALF,CALL,CALM,CALOMEL,CAME,CAMEL,CAMEO,CANAL,CANE,CANOE,CANT,CANTO,CATE,CELL,CELLO,CELT,CENT,CENTO,CENTUM,CLAM,CLAN,CLANK,CLEAN,CLEF,CLEFT,CLOAK,CLOMB,CLONE,CLOT,CLOUT,CLUB,CLUE,COAL,COAT,COBALT,COBB,COFFLE,COKE,COLA,COLE,COLLET,COLT,COLUMN,COMA,COMB,COMBAT,COMBE,COME,COMET,COMTE,CONE,CONFUTE,CONTE,COTE,COUNT,COZEN,CUBE,CUFF,CULL,CULT,CUTE,EBON,ECLAT,ELAN,ENACT,ETNA,FABLE,FACE,FACT,FACTUAL,FAKE,FALCON,FALL,FALLEN,FAME,FANE,FATAL,FATE,FATEFUL,FAUCET,FAULT,FAUN,FAUNA,FEAT,FELL,FELLA,FELON,FELT,FETAL,FLACK,FLACON,FLAKE,FLAM,FLAME,FLANK,FLAT,FLAUNT,FLEA,FLECK,FLOAT,FLOCK,FLOE,FLOUNCE,FLOUT,FLUE,FLUENT,FLUKE,FLUME,FLUTE,FOAL,FOAM,FOCAL,FOEMAN,FOLK,FOMENT,FONT,FOUL,FOUNT,FUEL,FULL,FUMBLE,FUME,FUNK,KALE,KANA,KANE,KATA,KENO,KENT,KNACK,KNELL,KNELT,KNOB,KNOCK,KNOLL,KNOT,KNOUT,KNUCKLE,LABEL,LACE,LACK,LACUNA,LAKE,LAMA,LAMB,LAMBENT,LAME,LAMENT,LANCE,LANCET,LANE,LANK,LATE,LATEN,LEAF,LEAK,LEAL,LEAN,LEANT,LEFT,LEMAN,LEMON,LENT,LENTO,LLAMA,LOAF,LOAM,LOAN,LOBE,LOCA,LOCAL,LOCALE,LOCATE,LOCK,LOCKET,LOCUM,LOFT,LONE,LOUT,LUCE,LUCENT,LUCK,LUMEN,LUNA,LUNE,LUTE,MACE,MACK,MACON,MAKE,MALE,MALL,MALLET,MALT,MANA,MANE,MANFUL,MANO,MANTEAU,MANTEL,MANTLE,MANTUA,MANUAL,MATE,MAUL,MAUN,MAZE,MEAL,MEAN,MEANT,MEAT,MELL,MELON,MELT,MELTON,MENO,MENTAL,MENU,META,METAL,MOAN,MOAT,MOCK,MOLE,MOLL,MOLTEN,MONK,MONTE,MOTE,MOTEL,MOUE,MOULT,MOUNT,MUCK,MUCKLE,MUFF,MUFFLE,MULE,MULL,MULLET,MUTABLE,MUTE,NABOB,NALA,NAME,NATAL,NEAT,NEBULA,NECK,NOBLE,NOEL,NOME,NOTA,NOTABLE,NOTE,NUKE,NULL,NUMB,OAKEN,OAKUM,OATEN,OATMEAL,OCEAN,OFFAL,OFTEN,OLLA,OMEN,ONCE,OUNCE,OUTBACK,TABLE,TABLEAU,TABU,TACK,TACKLE,TACO,TAKE,TAKEN,TALA,TALE,TALK,TALL,TALON,TAME,TANK,TEAK,TEAL,TEAM,TELA,TELAMON,TELCO,TELL,TOKEN,TOLE,TOLL,TOMB,TOME,TONE,TUBAL,TUBE,TUCK,TUFA,TULE,TULLE,TUMBLE,TUNA,TUNE,UNABLE,UNCLE,UNCO,UNFELT,UNLOCK,UNMAKE,UNTO,ZEAL,ZEALOT,ZETA,ZONE";

    public static void main(String[] args) {
        String availableLetters = "LABKCOLNAEMFKUTFZB";
        char[] availableLettersCharArr = availableLetters.toCharArray();

        String[] words = wordsStr.split(",");
    }
}

【问题讨论】:

  • 如果你想看看我会在哪里使用这个算法,你可以从 google play 下载 zade games kelime101。
  • 例如,如果算法选择了球和痤疮,则有 C ,剩下 O
  • 它可以选择 BANK 和 LOCAL 只剩下字母 E 你可以用这些词来测试你的算法。我可以得到可用的单词,我们可以用我拥有的字母构建,但算法应该选择单词,所以应该保留更少的字母
  • 如果需要 cmets 来描述问题,编辑问题并将其添加到问题中会很有用。
  • 你有可用的构造词列表吗?还是您正在构建所有可能的组合,然后对照字典检查有效单词?

标签: algorithm


【解决方案1】:

这是一个装箱问题:如果每个单词由 27 个数字组成的向量表示,一个表示该单词中每个字母的数量,那么您想要最大化 I 使得 sum(Vk 0<k<i)<= W 其中W 是首字母相同的向量

【讨论】:

    【解决方案2】:

    只需使用HashSet<char>。对于每个单词,清除容器并将该单词的每个字符放入此集合中。

    这保证不会有重复。然后通过调用hashset.size()(或你使用的语言等效)。

    通过将最大大小最初设置为 0,您可以比较每个单词。

       size = 0 
       bestWord = null;
       for(w : wordList){
           hashset = new HashSet<char>()
           for(c : w){
              hashset.insert(c)
           }
           if(hashset.size() > size){
               size = hashset.size()   
               bestWord = w
           }
       }
       print(bestWord)
    

    【讨论】:

    • 您可以测试您的算法找到哪些单词。我不明白。它是如何找到单词的。
    • 它是一个伪代码,不兼容;)。它找到一个单词中具有最多不同字符的单词。例如AAB - 2 个字符,AABDB - 3 个字符,ABCD - 4 个字符等。在这种情况下,它将返回 ABCD。通过向集合中插入两次相同的元素,不会导致其状态发生变化。例如set.insert("a"); set.insert("a") - set.size() 仍然等于 1,尽管执行了 2 次插入。
    【解决方案3】:

    这被称为加权集打包问题,权重是字符串的长度,正如大卫在this post 中指出的那样。这是一个NP完全问题。近似解和最优解都可以在this paper 中找到。但是我没有时间阅读它。

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多