面试题28:字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来

的所有字符串abc、acb、bac、bca、cab和cba。

参见LeetCode-Permutations

 

本题扩展:

如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办?

还是输入三个字符a、b、c,则它们的组合有a、b、c、ab、ac、bc、abc,当交换字符串中的两个字符时,虽然能得到两个不同的排列,但

却是同一个组合。比如ab和ba是不同的排列,但只算一个组合。

如果输入n个字符,则这n个字符能构成长度为1的组合,长度为2的组合、......、长度为n的组合。在求n个字符的长度为m(1<=m<=n)的组合的时候,我们

把这个n个字符分成两部分:第一个字符和其余的所有字符。如果组合里包含第一个字符,则下一步在剩余的字符里选取m-1个字符,如果组合里不包含第一个字符,

则下一步在剩余的n-1个字符里选取m个字符。也就是说,我们可以把求n个字符组成长度为m的组合的问题分解成两个子问题,分别求n-1个字符串中长度为m-1的

组合,以及求n-1个字符的长度为m的组合。这两个子问题都可以用递归的方式解决。

 

posted @ 2015-07-03 15:52  Rosanne  阅读(218)  评论(0编辑  收藏  举报