在Java中解读字母-获得所有可能的字母组合
已解决:我的问题已解决,但请随意使用其他方法回答。 这是解读者用答案写的信 我目前是AP计算机科学专业的学生。我一直在做一个字母解读器,它可以在字典中阅读并打印一个字母集输入时可能出现的单词列表。为此,我用在Java中解读字母-获得所有可能的字母组合,java,word,scramble,Java,Word,Scramble,已解决:我的问题已解决,但请随意使用其他方法回答。 这是解读者用答案写的信 我目前是AP计算机科学专业的学生。我一直在做一个字母解读器,它可以在字典中阅读并打印一个字母集输入时可能出现的单词列表。为此,我用map 其中“earth”将在“aerht”键下和相应的集合中输入 Example How Would I generate all of these: CAKE -> ACEK A C E K AC CE
map
其中“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,aer,aert
以此类推,这样我就可以将所有这些键与我在字典中读到的键进行交叉引用。
字母[]按顺序包含a、e、h、r、t。此外,test是Set的数组列表。关键是“aehrt”
for(int z=0;z一种方法是不断增加一个数字,其中数字的位表示您组中的字母。例如,对于“earth”,您将通过从1到31的计数遍历所有非零的5位数字。位0可以表示“e”或“h”;这并不重要。只要保持一致即可
在每个步骤中,找到设置位,并从您的组中选择相应的字母。这是可能的子组之一。(您可能需要使用哈希集或其他方法来消除重复项…例如,如果您的组有2个“e”或其他内容。)因此对于“earth”,1可能是“e”,2可能是“a”,3可能是“ea”,4可能是“r”,等等
当您的数字大于或等于(1以字母键“aehrt”开头时,您可以使用以下方法找到所有可能的字母组合:
从:S0={}
接下来,取a
:S1=a⋅S0∪ S0∪ {a} ={a}
接下来,取e
:S2=e⋅S1∪ S1∪ {e} ={ae,a,e}
接下来,取h
:S3=h⋅S2∪ S2∪ {h} ={aeh,ah,eh,ae,a,e,h}
等等
一旦你有了S5
(整套组合),对照你的地图检查它们
publicstaticvoidmain(字符串…参数){
Set=新树集();
String key=“aehrt”;
//S1=c*S0∪ {c}∪ S0
对于(intz=0;z
假设您有字符串蛋糕:所有4位数字都是不同的。
然后您将拥有组合,即4C1+4C2+4C3+4C4=2^4-1=15
一块蛋糕
如果你写的是从1到2^4-1的数字,它们将是
0001
0010
0011
0100等等。
将这些数字映射到字符串蛋糕。无论在哪里找到0,该字符都将为空。例如
0001=\uuue
0010=uuk_
0011=uuke
0100=u A u_
等等。你会得到你所有的蛋糕组合。
我编写了一个程序,用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;
}
}
公共类所有组合{
公共静态void main(字符串[]args){
字符c[]=新字符[]{'c','A','K','E'};
int t=(int)数学功率(2,c.长度);
对于(inti=1;i请显示一个代码示例,显示您的尝试。相反,我要求的是{“e”、“a”、“r”、“t”、“h”}的所有字母组合不一定是“a”。erht、rht和ht也会出现在那个集合中。@Qantas94Heavy:哦,我的错误。对不起。@Roneymael:别担心,一开始也很困惑。我想你的意思是Map
是的,这很难理解。通过在末尾添加一个更新部分来更新你的问题,并在那里发布你的代码。这种方法确实增加了时间复杂性:O(n*2^n)代替O(2^n)。
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]
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;
}
}