[C语言]字符的排列和组合

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);
}


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值