字符串的排列组合

来源:互联网 发布:java编程格式 编辑:程序博客网 时间:2024/06/05 15:35

本文是参考何海涛的博客第28题,自己进行学习的过程总结。


题目:输入一个字符串,打出该字符串的所有排列组合,不考虑重复字符。

思路:一般拿到这种题目,我们会自己写一个最简单的字符串abc,来进行排列组合,找出规律,我们会写出abc,acb,bac,bca,cab,cba。这六种,观察规律,我们会发现这六种排列组合,一组是以a开头,一组以b开头,一组以c开头,所以我们会想到递归,依次将a、b、c三个字母放在首位,然后将后面的字符串放进去递归,但是我们在编程的时候会发现,原来的字符串abc在以a为开头的排列组合输出完成后,b和c的相对位置关系发生了变化,为了保证能依次将每个字符放到第一个位置,我们每次递归完成后,要将原来的字符串的位置还原。

public class PermutationAndCombination {/** * 题目:输入一个字符串,输出字符串的所有排列组合 * 思路:拿abc来讲,a先和自己作交换,后面就是bc的排列组合,a再和b做交换,后面就是ac的排列组合,a和c作交换,后面就是bc的排列组合。 * a和b做交换后,成为bac,想要a再和c作交换,就要先把a和b的交换再换回去。         * */public static void swap(char[] c, int i,int j){char temp = c[i];c[i] = c[j];c[j] = temp;}public static void combination(char[] c,int low,int high){if(low==high)System.out.println(c);int i=0;for (i = low; i <= high; i++)    {            swap(c,low, i);            combination(c, low+1, high);            swap(c,low,i); //将原来的交换还原,以保证依次将每个字符换到首位进行递归。    }}public static void main(String[] args){char[] str = {'a','b','c'};combination(str,0,str.length-1);}}


扩展:当字符串中有重复字符,我们怎么实现排列组合,并且不能输出重复的排列。

思路:我们原来的思路,是将每个字符依次放在首位,然后将后面的字串进行递归,现在出现了重复字符,我们只能将重复的字符换到首位递归一次,这就需要对每个字符进行标记,哪些字符已经换到首位过,哪些没换过。我们用一维的数组,换过的用1表示,没换过的用0表示。


public class PermutationAndCombination {/** * 题目:输入一个字符串,输出字符串的所有排列组合 * 思路:拿abc来讲,a先和自己作交换,后面就是bc的排列组合,a再和b做交换,后面就是ac的排列组合,a和c作交换,后面就是bc的排列组合。 * a和b做交换后,成为bac,想要a再和c作交换,就要先把a和b的交换再换回去。 */public static void swap(char[] c, int i,int j){char temp = c[i];c[i] = c[j];c[j] = temp;}public static void combination(char[] c,int low,int high){byte[] flag = new byte[256];if(low==high)System.out.println(c);int i=0;for (i = low; i <= high; i++)    {if(flag[c[i]]!=1){            swap(c,low, i);            combination(c, low+1, high);            swap(c,low,i); //将原来的交换还原,以保证依次将每个字符换到首位进行。            flag[c[i]]=1;}    }}public static void main(String[] args){char[] str = {'a','b','b'};combination(str,0,str.length-1);}}




1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玖瑰花叶子黄怎么办 羊偷吃腥油和花生饼吃多了怎么办 肉牛眼睛有点变黄少吃东西怎么办 黑坑草鱼不开口怎么办 花生和瓜子受潮皮了怎么办? 菜叶上长了腻虫怎么办 磨辊耐磨层脱落怎么办 磨辊耐磨层小块脱落怎么办 密封胶皮圈松了怎么办 汽筒里胶皮垫密封不严怎么办 磁耦气缸脱磁了怎么办 无杆气缸行程大怎么办 c4d中模型变成线怎么办 内径槽异性需要车一刀怎么办 轴承太紧影响转速怎么办 电动车前轮蝶刹抱死怎么办 摩托三轮车油刹抱死怎么办 手动档汽车离合抱死怎么办 别克gl8后轮吃胎怎么办 扭力梁后轮吃胎怎么办 非独立悬挂吃胎怎么办 货车半轴法兰盘裂纹怎么办 小天才平板裂屏了怎么办 新车撞了个坑怎么办 新车碰了个坑怎么办 汽车顶被砸了个坑怎么办 途观l前减震异响怎么办 锦明8代声音太大怎么办 手机网页无法加载插件怎么办 微信公众号被投诉怎么办 住了酒店的尾房怎么办 喜欢前任的闺蜜怎么办 闺蜜给介绍对象怎么办 喜欢对象的发小怎么办 山东省直医保卡丢失怎么办 高铁票如果错过了怎么办 动车错过了时间怎么办 长途动车错过了怎么办 动车如果错过了怎么办 没有取票错过了怎么办 动车出站没检票怎么办