Unscramble Letters in Java - 获取所有可能的字母组合

Posted

技术标签:

【中文标题】Unscramble Letters in Java - 获取所有可能的字母组合【英文标题】:Unscramble Letters in Java - Get all possible combinations of the letters 【发布时间】:2013-12-21 21:28:18 【问题描述】:

已解决:我的问题是已解决,但请随时用其他方法回答。 这是解读者用答案制作的字母。 Project Page

我目前是一名 AP 计算机科学专业的学生。我一直在研究一个字母解扰器,它可以在字典中读取并打印输入字母集时可能出现的单词列表。为此,我用Map<String,Set<String>> 制作了一张地图 其中“earth”将在“aerht”键下和相应的集合中输入。

Example How Would I generate all of these:
CAKE -> ACEK
A          C           E           K
AC        CE           EK               
ACE       CEK            
ACEK

AE       CK
AEK
ACK
AK

我遇到的问题是一些键值没有被检查,因为目前我接受了一组数字并将字符按字母顺序排列 例如地球-> aehrt 然而,这会跳过诸如 aht->hat 或 eht -> the 之类的组合。

所以基本上我的问题是如何简化获取包含在这样一个键中的所有字母组合的过程。例如地球-> aehrt,a,ae,aeh,aehr,ah,ahr,ahrt,aer,aert 依此类推,这样我就可以将所有这些键与我读过的字典中的键进行交叉引用。 letters[] 依次包含 a,e,h,r,t。另外,test 是一个 Set 的 ArrayList。键是“aehrt”。

for(int z = 0; z<key.length();z++) 
    Set<String> temp = new HashSet<String>();

    //s1 = t*s0 ∪ t ∪ s0 = t
    for(String str: test.get(z)) //t*s0
                str+=letters[z];

    test.get(z).add(letters[z]); //t  
    test.get(z).addAll(test.get(z-1));//s0
    test.get(z).addAll(temp);

【问题讨论】:

请展示一个代码示例,说明您尝试过的内容。 我要求所有按字母顺序排列的 “e”、“a”、“r”、“t”、“h” 组合不一定是“a”。 erht、rht 和 ht 也将在该集合中。 @Qantas94Heavy:哦,我的错。对不起。 @RoneyMichael:别担心,一开始也很困惑。 我想你的意思是Map&lt;String,Set&lt;String&gt;&gt; 【参考方案1】:

从按字母顺序排列的键“aehrt”开始,您可以使用以下方法找到所有可能的字母组合:

    开头:       S<sub>0</sub> = 接下来,取a:  S<sub>1</sub> = a⋅S<sub>0</sub> ∪ S<sub>0</sub> ∪ a = a 接下来,取e:  S<sub>2</sub> = e⋅S<sub>1</sub> ∪ S<sub>1</sub> ∪ e = ae, a, e 接下来,取h:  S<sub>3</sub> = h⋅S<sub>2</sub> ∪ S<sub>2</sub> ∪ h = aeh, ah, eh, ae, a, e, h 等等...

一旦您拥有S<sub>5</sub>(整个组合),请对照您的地图检查它们。


public static void main(String... args)     
    Set<String> set = new TreeSet<String>();
    String key = "aehrt";

    //S1 = c*S0 ∪ c ∪ S0
    for(int z = 0; z < key.length();z++) 
        Set<String> temp = new HashSet<String>();
        char c = key.charAt(z);        

        for(String str: set)
            temp.add(str + c); // ∪ c*S0
        set.add(c+"");         // ∪ c
        set.addAll(temp);      // ∪ S0
    

    System.out.println(set);


output: [a, ae, aeh, aehr, aehrt, aeht, aer, aert, aet, ah, ahr, ahrt, aht, ar, art,
         at, e, eh, ehr, ehrt, eht, er, ert, et, h, hr, hrt, ht, r, rt, t]

【讨论】:

是的,这很难读。通过在末尾添加 UPDATE 部分来更新您的问题,并在此处发布您的代码。【参考方案2】:

假设您有 String CAKE :所有 4 位数字都不同。 然后你会有4C1 + 4C2 + 4C3 + 4C4 = 2^4 - 1 = 15的组合@

C A K E CA Ak KE EC CK CE CAK AKE KEC CKE CAKE .

如果你写从 1 到 2^4-1 的数字,它们将是 0001 0010 0011 0100 等等。 将这些数字映射到您的 String CAKE 。无论您在哪里找到 0,该字符都是空的。示例

0001 = _ _ _ E

0010 = _ _ K _

0011 = _ _ KE

0100 = _ A _ _

等等。你会得到你所有的蛋糕组合。 我用java写了一个程序来说明这一点:

public class AllCombinations 
    public static void main(String[] args) 
        char c[] = new char[] 'C','A','K','E';
        int t = (int) Math.pow(2, c.length);
        for(int i=1;i<t;i++) 
            String s = Integer.toBinaryString(i);
            String comb = getComb(s,c);
            System.out.println(comb);
        
    

    private static String getComb(String s, char[] c) 
        String comb = "";
        int len = s.length();
        for(int i=0;i<s.length();i++) 
            if(s.charAt(i) == '1') 
                comb += c[len-i-1];
            
        
        return comb;
    

【讨论】:

这个方法确实增加了时间复杂度:O(n*2^n) 而不是 O(2^n)。【参考方案3】:

一种方法是不断增加一个数字,其中数字的位代表您组中的字母。例如,对于“earth”,您将遍历所有非零的 5 位数字,从 1 数到 31。位 0 可以表示“e”或“h”;没关系。保持一致即可。

在每个步骤中,找到设置的位,然后从您的组中选择相应的字母。这是可能的子组之一。 (您可能需要使用 HashSet 或其他东西来消除重复...例如,如果您的组有 2 个“e”或其他东西。)所以对于“地球”,1 可能是“e”,2 可能是“a” , 3 将是“ea”,4 将是“r”,依此类推。

当你的数字大于或等于(1

注意,这并没有给出所有可能的排序/安排,只是可能的组。希望您已经安排好数据,以便您可以按包含已排序字符的字符串进行搜索。

【讨论】:

以上是关于Unscramble Letters in Java - 获取所有可能的字母组合的主要内容,如果未能解决你的问题,请参考以下文章

744. 寻找比目标字母大的最小字母

744. 寻找比目标字母大的最小字母

CodeForces 709C Letters Cyclic Shift (水题)

LeetCode 316. Remove Duplicate Letters(贪心)

使用mybatis报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, jav

Jmeter报错001--- ERROR o.a.j.JMeter: Uncaught exception in thread Thread[AWT-EventQueue-0,6,main] jav