打印任意字符串排列组合

#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;
}

for (size_t i = index; i < s.size(); i++)
{
swap(s ,index ,i);
myPrint(s,index+1);
swap(s, index, i);
}
}

void test(string s)
{
myPrint(s, 0);
cout << endl;
}

int main()
{
test("");
test("a");
test("ab");
test("abc");
test("abcd");
return 0;
}

时间: 2024-11-18 20:26:46

打印任意字符串排列组合的相关文章

字符串排列组合问题

一.全排列无重复字符 #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 =

字符串排列组合

输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串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 combi

字符串的排列组合总结

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

打印给定字符串中字符的所有排列

题目: 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 解决: 简单起见,字符串中没有相同的字符. 其实这是个递归的过程:对于字符串str,先分别逮住其中的每一个,如s,把它从str中踢开,成了 s + tr(下一次踢开t变为 t + sr),然后对于剩下来的,再从剩下的再次分别踢开一个加到左边的后面(假想被踢开的都在左边,剩下的都在右边哈),一直如此,直至右边都踢光了.算法如下

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

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

字符串的排列组合

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

[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小.例如:a=[100,99,98,1,2, 3]b=[1, 2, 3, 4,5,40] 题目是看到QQ群友发的,网上也百度了下目前已经有好几种解法了.写了半天有点晕,后面忽然想到中学时候数学里面的排列组合的方法.方法对于较短的list可行,长list组合情况太多,可能耗时太长或溢出. 1 from itertools im

c/c++面试题(4)字符串翻转/打印任意进制格式/类型转换

1.字符串的翻转,这里一般是字符数组.不包括字符串字面值. char* reversal_str(char* str,size_t size); 翻转之后的字符串是原来的字符串的翻转. #include <stdio.h> #include <string.h> char* reversal(char* str,size_t len) { if(str != NULL) { char* start = str; char* end = str + len - 1; char ch;