字符串排列组合

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。

<?php

class Test{

/**
* arr 元素数组,
* m 从arr 中选择的元素个数
* isRepeat arr中的元素是否可以重复(默认重复)
* b 中间变量
* n 等于第一次调用时的 m
* res 存放结果
*/
public static function combine($arr, $m, $isRepeat = 0, $b = [], $n = 0, $res = []) {
		!$n && $n = $m;
	if($m == 1) {
	foreach($arr as $item)
	//拼接中间变量到数组中去
	$res[] = array_merge($b, [$item]);
	} else {
	foreach($arr as $key => $item) {
	$b[$n - $m] = $item;
	$tmp = $arr;
	if(!$isRepeat) unset($tmp[$key]);// 如果不可重复
	$res = self::combine($tmp, $m-1, $isRepeat, $b, $n, $res);
	  }
	 }
	 return $res;
	}

}

var_dump(Test::combine([‘a‘,‘b‘, ‘c‘], 3));

  

时间: 2024-08-18 19:18:12

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

字符串排列组合问题

一.全排列无重复字符 #include<stdio.h> #include<string.h> char buf[1024]; void func(int index); void swap(int index1,int index2); int main() { memset(buf,0,sizeof(buf)); sprintf(buf,"abc"); func(0); return 0; } void func(int index) { if(index

字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba . #include<stdio.h> #include<string.h> static int number=0; void Swap(char *a ,char *b) { char temp =

打印任意字符串排列组合

#include <iostream>#include <string> using namespace std; void swap(string& s,int i,int j){ char a = s[i]; s[i] = s[j]; s[j] = a;} void myPrint(string& s, size_t index){ if (index >= s.size()) { cout << s << endl; return

字符串的排列组合

1.字符串的组合 字符串的组合,有字符串abc,它的所有组合为a,b,c,ab,ac,abc.求字符串的组合可以使用递归的方法,程序如下: void print(string &s,int start,vector<char> &t) { if(start==s.size()) { return ; } int i=0; for(i=start;i<s.size();++i) { t.push_back(s[i]); //使用递归+回溯的方法求组合 vector<c

字符串的排列组合总结

问题1 :输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 思路:这是个递归求解的问题.递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环:(2)子问题在规模上比原问题小:(3)子问题可通过再次递归调用求解:(4)子问题的解应能组合成整个问题的解. 对于字符串的排列问题.如果能生成n - 1个元素的全排列,就能生成n个元素的全排列.对于只有1个元素的集合,可以直

9.9递归和动态规划(五)——确定某字符串的所有排列组合

/** * 功能:确定某字符串的所有排列组合. */ 注意:不考虑重复字符.若考虑重复字符,只需在加入permulations时去掉重复的字符串即可. /** * 思路:元素由少到多,将新的元素塞进所有字符串中间的任意可能位置. * @param str * @return */ public static ArrayList<String> getPerms(String str){ if(str==null) return null; ArrayList<String> per

编写一个方法,确定某字符串的所有排列组合

public static ArrayList<String> getPerms(String str) { if(str==null) return null; ArrayList<String> permutations=new ArrayList<String>(); if(str.length()==0)//终止条件 { permutations.add(""); return permutations; } char first=str.c

排列组合递归和非递归算法总结篇

#include <iostream> #include <string> #include <math.h> #include <vector> #include <algorithm> using namespace std; //method1 bool flag[5] ; int arr[5] = {1,2,3,4,5}; int len = sizeof(arr)/sizeof(int); void Comb(int n,int cou

【剑指offer】字符串的组合

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26405471 剑指offer上的拓展题目,输入一个字符串,输出该字符串的字符的所有组合,比如输入字符串:abc,输出a.b.c.ab.ac.bc.abc. 思路:与上一题类似,也可以用递归求解.可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m).原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和.对于求C(n, m),从第一个字符开始扫描,每个字符有两种