排列问题
问题描述:已知字符串的中字符是互不相同的,求所有可能的字符排列。例如输入序列ab,则得到的所有可能序列应当为aa、ab、ba、bb
思路:此题目可以采用递归的思想,由于所有可能排列的位数均是n位,可以利用一个长度为n的数组array[]来存放最终要输出的结果,并以array_pos表示数组中存放的字符下标,当array_pos==len时,输出array的值。由于含有n个字符的字符串,满足条件的排列共有n^n个,因此在递归当中需要用到一个for循环。
1 | 设f(str,array,len,pos)为输出可能的排列序列的函数,则递归模型如下: |
1 |
|
时间复杂度:O(n^n),空间复杂度:O(n)
组合问题
问题描述:已知字符串中的字符是互不相同的,编写程序输出字符串的任意组合,例如给定abc,则任意组合为a、b、c、ab、ac、bc、abc
解法一:此题目可以采用递归的方式进行处理,对于n个字符中,取m个字符的排列,可分为如下两种情况
情况①:将第1个元素保留,并在剩余的n-1个元素中选取m-1个元素进行组合
情况②:跳过第1个元素,在剩余的n-1个元素中选取m个元素进行组合
1 | 设f(str,buf,num)为输出任意组合的函数,则递归模型如下: |
1 |
|
解法二:利用位运算
对于n个字符的字符串,其可能的组合有2^n-1种,以abc为例,则利用二进制进行表示,用1表示字符输出,0表示字符不被输出,则所有可能的结果均可表示为a(100)、b(010)、c(001)、ab(110)、ac(101)、bc(011)、abc(111)
1 |
|
参考资料:《编程之法—面试和算法心得》习题
- 本文作者: Phoenix
- 本文链接: https://phoenix500526.github.io/2018/12/20/字符串的排列与组合问题/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!