文字列配列の生成

4413 ワード

質問:
文字列のすべての配列を出力する関数を与えます.
アイデア:
配列アルゴリズムが流行しているのは再帰,置換,辞書序法である.
1.各n配列は、各文字とn−1配列との結合である再帰アルゴリズム.アルゴリズムの核心部分は再帰木を維持し,木の根から木の葉への経路が配列されている.
2.置換アルゴリズムは、置換群の理論に基づいて、1回の置換が完了するたびに1つの配列を生成する.
3.ディクショナリシーケンス法は、配列の次の配列を生成するたびに、数値カウントでシミュレーションすることができ、もちろん手動で生成することもできる.
実装:
1.再帰アルゴリズム:
#include <stdio.h>
void swap(char *l, char *r){
char s = *l;
*l = *r;
*r = s;
}
void generate(char *buf, char *p, int len){
int i;
if(len == 1){
printf("%s
", buf);
return;
}
for(i = 0; i < len; ++i){
swap(p, p+i);
generate(buf, p+1, len-1);
swap(p, p+i);
}
}
int main(){
char buf[] = "1234";
generate(buf, buf, sizeof(buf)-1);
return 0;
}

2.置換アルゴリズム:
占拠して、しばらくそれを理解していないで、また知っている人がいくつかの比较的に浅い资料を提供して见ることができることを望みます.
3.ディクショナリ順序アルゴリズム:
#include <stdio.h>
void swap(char *l, char *r){
char s = *l;
*l = *r;
*r = s;
}
int next(char *buf, int len){
int i, j, s = len-1, nn = 0;
for(i = s; i > 0; --i){
if(buf[i-1] < buf[i]){
i -= 1;
nn = 1;
break;
}
}
j = s;
while(buf[i] > buf[j]){
--j;
}
swap(buf+i, buf+j);
i += 1;
j = s;
while(j > i){
swap(buf+i, buf+j);
++i;
--j;
}
return nn;
}

void generate(char *buf, int len){
do{
printf("%s
", buf);
}while(next(buf, len));
}

int main(){
char buf[] = "1234";
generate(buf, sizeof(buf)-1);
return 0;
}

ディクショナリシーケンスアルゴリズムはC++のアルゴリズムライブラリに対応する関数があり、nextというものでもあります.