C /C++で特定の文字セットから作成された連続する単語のリストを作成する効率的な方法を見つける必要があります。例を挙げましょう:
文字セットが「abc」の場合、アルゴリズムは次のように出力する必要があります。
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
...
私にはいくつかのアイデアがありますが、すべてがあまりにも多くの数学を必要とし、私は本当に速い解決策を必要としています。誰がアイデアを持っていますか?
C /C++で特定の文字セットから作成された連続する単語のリストを作成する効率的な方法を見つける必要があります。例を挙げましょう:
文字セットが「abc」の場合、アルゴリズムは次のように出力する必要があります。
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
...
私にはいくつかのアイデアがありますが、すべてがあまりにも多くの数学を必要とし、私は本当に速い解決策を必要としています。誰がアイデアを持っていますか?
これは、この回答に対する実際のわずかな変更です。
文字列のすべての可能な組み合わせを作成するための最適なアルゴリズムは何ですか?
上記の答えを使用すると、基本的にメイン入力文字列の順列を実行するルーチンの周りにラッパーを配置して、順列ファインダーが事前に並べ替えられた入力文字列のすべての順列を見つけられるようにすることができます。
#include <stdio.h>
#include <string.h>
char* numToColumn(int n, char* outstr, const char* baseset){
char* p = outstr;
int len;
len = strlen(baseset);
while(n){
*p++ = baseset[0 + ((n % len == 0)? len : n % len) - 1];
n = (n - 1) / len;
}
*p = '\0';
return strrev(outstr);//strrev isn't ANSI C
}
char* incrWord(char* outstr, const char* baseset){
char *p;
int size,len;
int i,carry=1;
size = strlen(baseset);
len = strlen(outstr);
for(i = len-1; carry && i>=0 ;--i){
int pos;
pos = strchr(baseset, outstr[i]) - baseset;//MUST NOT NULL
pos += 1;//increment
if(pos == size){
carry=1;
pos = 0;
} else {
carry=0;
}
outstr[i]=baseset[pos];
}
if(carry){
memmove(&outstr[1], &outstr[0], len+1);
outstr[0]=baseset[0];
}
return outstr;
}
int main(){
const char *cset = "abc";
char buff[16];
int i;
for(i=1;i<16;++i)//1 origin
printf("%s\n", numToColumn(i, buff, cset));
strcpy(buff, "cc");//start "cc"
printf("\nrestart\n%s\n", buff);
printf("%s\n", incrWord(buff, cset));
printf("%s\n", incrWord(buff, cset));
return 0;
}
/* RESULT:
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
restart
cc
aaa
aab
*/
次のJavaコードは正常に機能します。
class Combination
{
static String word;
static int length;
static int[] num;
public static void main(String args[])
{
word = "abc";
length = word.length();
num = new int[length + 1];
for(int i=1; i<=length-1; i++)
num[i] = 0;
num[length] = 1;
while(num[0] == 0)
{
display();
System.out.println();
increment(length);
}
}
public static void increment(int digit)
{
if(num[digit] + 1 <= length)
num[digit]++;
else
{
num[digit] = 1;
increment(digit-1);
}
}
public static void display()
{
for(int i=1; i<=length; i++)
{
if(num[i] == 0)
System.out.print(' ');
else
System.out.print(word.charAt(num[i]-1));
}
}
}
その複雑さについてはよくわかりません。しかし、私はそれがそれほど複雑ではないと思います。