字符串的全排列与组合

一、字符串的排列

问题描述:给出一个字符串,请设计一个函数输出所有可能的排列,如abc,可能的排列顺序有abc、acb、bac、bca、cba、cab

 问题分析:要对长度为n的序列进行排序,可以转化为固定第一个的值,再对剩余的n-1个进行排序的问题,可以用递归实现。由于第一个的值可以是任何一个,可用第一个值与其他值依次交换实现。如序列abc可以转化为如下三种情况:

(1)第一个固定为a,对bc进行排序

(2)第一个固定为b,对ac进行排序

(3)第一个固定为c,对ab进行排序

代码

二、字符串的组合

问题描述:给出一个字符串,请输出所以可能的组合,如abc的组合有a、b、c、ab、bc、ac、abc

问题分析:假设长度n-1的字符串的组合已经知道,那么长度n的字符串的组合有如下情况:

(1)、保持原有组合集不变

(2)、原有组合集中每个组合后面添加第n个字符,并添加该组合

(3)、添加一个由第n个字符组成的组合

额。。。语文水平实在是不咋的,下面举个例子来说明下,如ab原有组合是a、b、ab,那么abc的组合有如下情况

(1)原有不变:a、b、ab

(2)每个组合添加第n个字符,在这里都添加了c:ac、bc、abc

(3)第n个字符组成的集合:c

所以最终abc的组合有(1)(2)(3)三种情况加起来:a、b、ab、ac、bc、abc、c

代码:

时间: 2024-09-28 01:15:18

字符串的全排列与组合的相关文章

《编程之法》1.3字符串的全排列,组合,重复排列,八皇后问题

题目描述:输入一个字符串,打印出该字符串中字符的所有排列,例如输入"abc",输出"abc","acb","bac","bca","cab","cba" 解法一:递归实现 类似于图的深度遍历搜索求全路径的算法,每次交换两个数,并输出,按照递归的方法,如求abcd的全排序,1:先求abcd后面的bcd全排列(同样先求b后面cd的全排列,然后b与后面的元素依次交换);2:

28 - 字符串的全排列和组合

字符串的排列 题目描述:http://ac.jobdu.com/problem.php?pid=1369 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 分两步: 第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符都交换一次: 第二步:固定第一个位置的字符,求后面所有字符的排列. 终止条件:当要求固定位置的字符为'\0'时,说明已经排列到字符串尾.

字符串数组全排列——逐个追加组合算法

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac;接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位

字符串全排列和组合算法

打印字符串的全排列 算法的思路: 把一个字符串分成两部分,第一个字符+后面部分所有的字符.这样就能够递归的求解整个过程了: 1.每个字符都做一次首字符 2.当某个字符作为首字符的时候,求后面所有字符的全排列 而这里的求后面所有字符的全排列可以看成递归的子问题 全排列的递归树: 但是这里还有一个问题,那就是字符串中有重复的字符时,这样的算法会增加最后的结果数目.比如说字符串aab,a+ab的全排列,然后交换还是a+ab的全排列.所以会增加结果的数目.解决方案就是:当遇到重复的字符的时候就跳过去,不

字符串的全排列(java)

差不多半个月没写博客了,今天再写一篇. 字符串全排列相信大家都不陌生,对于我来说真的是写了又忘,忘了又写,所以决定写成一篇博客,废话不多说下面我来分析问题: 问题描述:给定一个字符串写出它的全排列,例如ab,全排列是ab,ba,而abc的全排列abc,acb,bac,bca,cab,cba. 解题思路:我们以具体例子分析,假如abc,如上所示,它的全排列是不是就是把字符串中每一个字符,放在第一位,然后再对剩下的字符串做全排列,如把a放在第一位,剩下bc 全排列是bc,cb,组合起来就是abc,a

字符串的排列和组合问题

1.字符串的全排列 题目:{a,b,c}要求输出{abc,acb,bac,bca,cab,cba}. 字符串全排列可以把字符串看成两个部分,第一个部分为它的一个字符,第二部分是后面的字符. 分两步完成:首先求所有可能出现在第一个位置的字符,即把第一个字符与后面的所有字符交换.第二步固定第一个字符,求后面所有字符的排列.从中可以看出是典型的递归思路. 1 public void helper(char[] array, int cur){ 2 if ( cur == array.length -

算法 输出字符串字符的任意组合

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" &quo

JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 例如: 原始字符串是"abc",打印得到下列所有组合情况 "a" "b" "c" "ab" "bc" "ca" "ba" "cb"

字符串的全排列JAVA实现

package com.kpp; /** * 求字符串的全排列 * 递归的思想 * 比如 abcde 先求出abcd的全排列,然后将e分别插入全排列的5个位置 * a 全排列 a * ab 全排列 ab ba * abd 全排列即是 cab acb abc cba bca bac * * @author kpp * */ public class QuanPaiLie { /** * @param args */ public static void main(String[] args) {