我有一系列n个字母:例如A B C A D或A B F A
我想要的是用字母之间的逗号来获取每个可能的变体。
即。为A B F A
A B F A
A,B F A
A B,F A
A B F,A
A,B,F A
A B,F,A
A,B F,A
A,B,F,A
有人可以推荐一个好的算法吗?语言不重要。
答案 0 :(得分:1)
使用二进制系统完成此任务。 1表示存在逗号,0表示不存在逗号。数字中的每个位置通知另一个逗号的存在。例如AFA:
00:A F A
01:A F,A
10:A,F A
11:A,F,A
必须从范围[0 ..(n-1)^ 2-1]
中取出数字答案 1 :(得分:1)
使用二进制数组表示是否有逗号的简单解决方案。
A B F A包含逗号可能为(AB,BF,FA)的三个位置
这意味着如果您创建3元素数组并尝试0和1的每个可能组合,您将获得所需的结果。 000,001,010,011,100,101,110,111
java中的简单程序打印n位的所有二进制排列:
String s = "ABFA";
int bits = s.length() - 1;
int lastNumber = (int)Math.pow(2, bits);
System.out.println(lastNumber);
for (int i = 0; i < lastNumber; i++) {
System.out.println(completeZeros(Integer.toString(i, 2), bits));
}
static String completeZeros(String s, int bits) {
String result = s;
for (int i = 0; i < bits - s.length(); i++) {
result = "0" + result;
}
return result;
}
要将二进制排列“010”应用于字符串“ABFA”,请使用下一个函数:
static String applyBinary(String s, String binary) {
String result = "" + s.charAt(0);
for (int i = 0; i < binary.length(); i++) {
if (binary.charAt(i) == '1') result += ", ";
result += s.charAt(i + 1);
}
return result;
}
输出结果为:
ABFA
ABF, A
AB, FA
AB, F, A
A, BFA
A, BF, A
A, B, FA
A, B, F, A
答案 2 :(得分:0)
这是一个简单的JavaScript演示。
var str = "ABFA";
function algo(str) {
var result = [];
var n = str.length;
var total = Math.pow(n-1, 2) - 1;
for(var mask = 0; mask < total; mask++) {
var bits = mask;
var newstr = "";
for(var i=0; i<str.length - 1; i++, bits>>>=1) {
var hasComma = (bits & 1) == 1;
newstr += str.charAt(i);
newstr += (hasComma ? "," : " ");
}
newstr += str.charAt(str.length - 1);
result.push(newstr);
}
return result;
}
algo(str);
答案 3 :(得分:0)
这个问题有两种方法。
1.Recursive(Start =“printAllComb(s,”“,0);”)
printAllComb(string s, string const, int i)
{
if ( i == s.length() )
print const
printAllComb(s,const+string.at(i)+',',i+1);
printAllComb(s,const+string.at(i),i+1);
}
2.Dynamic Programming
char binaryS[s.length]="0000";
//Basically no. of zeros = no. of Alphabets in the string
//define a function AddOne() which adds 1 to the character representation
//AddOne() modifies the character array such that it stays in the bit representation
//Characters because to save space
while ( All the bits are not one )
{
for ( int i=0; i<s.length(); i++ )
{
print s.at(i)
if ( binaryS.at(i) == '1' )
print ","
}
print "\n"
AddOne();
}