Java中的解读字母 - 获取所有可能的字母组合

时间:2013-12-05 04:39:22

标签: java word scramble

解决:我问的是Solved,但可以随意用其他方法回答。 这是用解答写的字母解码器。 Project Page

我目前是AP计算机科学专业的学生。我一直在研究一个字母解读器,它读取字典并打印输入字母集可能的单词列表。为此,我制作了一张Map<String,Set<String>>的地图 其中“地球”将在关键字“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

我遇到的问题是,目前没有检查某些键值,因为我接受了一组数字并按字母顺序排列字符 例如earth-&gt; aehrt 但是这会跳过诸如aht-> hat或者eht之类的组合 - &gt;的。

所以基本上我的问题是如何简化获得这种密钥中包含的所有字母组合的过程。例如地球 - > aehrt,一,AE,AEH,aehr啊,AHR,ahrt,爱尔兰,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);
}

3 个答案:

答案 0 :(得分:3)

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

  1. 以:S0 = {}
  2. 开头
  3. 接下来,请aS1 = a⋅S0 ∪ S0 ∪ {a} = {a}
  4. 接下来,请eS2 = e⋅S1 ∪ S1 ∪ {e} = {ae, a, e}
  5. 接下来,请hS3 = h⋅S2 ∪ S2 ∪ {h} = {aeh, ah, eh, ae, a, e, h}
  6. 等...
  7. 一旦你有S5(整套组合),就可以在你的地图上检查它们。


    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]
    

答案 1 :(得分:1)

假设您有字符串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等等。  将这些数字映射到您的字符串CAKE。无论你在哪里找到0该字符都是空的。例如

0001 = _ _ _ E

0010 = _ _ K _

0011 = _ _ KE

0100 = _ A _ _

等等。您将获得CAKE的所有组合。 我写了一个程序来说明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;
    }
}

答案 2 :(得分:0)

一种方法是不断增加一个数字,其中数字的位代表组中的字母。例如,对于“earth”,您将通过从1到31的计数来查看所有非零的5位数字.Bit 0可以表示“e”或“h”;这并不重要。只是保持一致。

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

当你的数字大于或等于(1 <&lt;字母数)时,你已经用尽了所有的可能性。

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