1、字符的排列
输入:abc
输出:abc acb bac bca cab cba
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void mySwap(char *a,char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
void PaiLie(char *list,int begin,int end)
{
int i;
if(list == NULL)
return;
if(begin == end)
{
printf("%s ",list);
printf("\n");
}else{
for(i = begin ; i<=end ;i++)
{
mySwap(&list[i],&list[begin]);
PaiLie(list,begin+1,end);
mySwap(&list[i],&list[begin]);
}
}
}
void main()
{
char list[] = "abc";
char out [4];
PaiLie(list,0,2);
//ZuHe(list,out,3,0,0);
}
如果有重复,去掉重复的,然后满足一些特定的要求(如:第3个位置不可以是4,3和5不可以相邻)
Java实现。
此方法需要输入数字从小到大排列,若不是只需在排列之前预处理一下即可。
关键是compareTo方法
package dataStruct;
import java.util.LinkedList;
import java.util.List;
public class PaiLie {
private static List<String> result = new LinkedList<String>();
private static String lastResult = "";
public static void main(String[] args) {
String s = "1223";
char[] c = s.toCharArray();
paiLie(c, 0, c.length - 1);
for (int i = 0; i < result.size(); i++)
System.out.println(result.get(i));
}
public static boolean validator(String s) {
if (s.compareTo(lastResult) <= 0) //去重复的关键
return false;
if (s.charAt(2) == '4')
return false;
if (s.indexOf("35") >= 0)
return false;
if (s.indexOf("53") >= 0)
return false;
return true;
}
public static void paiLie(char[] c, int begin, int end) {
if (begin == end) {
String s = new String(c);
if (validator(s)) {
lastResult = s;
result.add(s);
}
}
for (int i = begin; i <= end; i++) {
swap(c, begin, i);
paiLie(c, begin + 1, end);
swap(c, begin, i);
}
}
public static void swap(char[] c, int i, int j) {
char temp;
temp = c[i];
c[i] = c[j];
c[j] = temp;
}
}
2、组合
输入: abc
输出: a ab abc ac b bc c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void ZuHe(char in[],char out[],int length,int inIndex,int outIndex)
{
int i;
for(i=inIndex;i<length;i++)
{
out[outIndex] = in[i];
out[outIndex + 1] = '\0';
printf("%s \n",out);
ZuHe(in,out,length,i+1,outIndex+1);
}
}
void main()
{
char list[] = "abc";
char out [4];
//PaiLie(list,0,2);
ZuHe(list,out,3,0,0);
}
如果字符不重复,用按位与运算从1到length跑一遍,与之对应的字符输出即是所有组合
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void ZuHe(char in[],int length)
{
int i,m,k,j;
m = 1 << length;
for(i=1;i<m;i++)
{
for(j=0,k=i;k>0;k>>=1,j++)
{
if(k&1) printf("%c",in[j]);
}
printf("\n");
}
}
void main()
{
char list[] = "abc";
char out [4];
//PaiLie(list,0,2);
ZuHe(list,3);
}