字符串的全排列和组合

字符串的排列

题目描述:?pid=1369 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

分两步: 第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符都交换一次; 第二步:固定第一个位置的字符,求后面所有字符的排列。

终止条件:当要求固定位置的字符为’\0’时,说明已经排列到字符串尾。

;void swap(char*c1, char* c2) {char temp = *c1;*c1 = *c2;*c2 = temp;}void Permutaion(char* pStr, char* pBegin) {if (*pBegin == ‘\0’) {cout << pStr << endl;return;}for (char* p = pBegin; *p != ‘\0’; p++) {swap(pBegin, p); // 交换pBegin位置和p位置Permutaion(pStr, pBegin+1); // 固定begin,对pBegin+1排列swap(pBegin, p); // 交换回来}}void Permutaion(char* pStr) {if (pStr == NULL)return;Permutaion(pStr, pStr);}int main() {char s[] = “abc”;Permutaion(s);}字符串的组合

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能组合出来的所有字符串a, b, c, ab, ac, bc, abc

求n个字符的长度为m的字符组合: 将n个字符分成两个部分,第一个字符和其余所有字符

如果组合包含第一个字符,则在剩下的n-1个字符中,选 m-1 个如果组合不含第一个字符,则在剩下的n-1个字符中,选 m 个;void PrintVector(const vector<char> &v) {for (vector<char>::const_iterator iter = v.begin(); iter != v.end(); iter++)cout << *iter;cout << endl;}// 从n个字符中找出m个字符的组合void Combination(char* pStr, int m, vector<char> &v) {if (m == 0) {PrintVector(v);return;}if (*pStr == ‘\0’ || m < 0)return;// 组合包含此字符,在剩下的字符中选m-1个v.push_back(*pStr);Combination(pStr+1, m-1, v);// 组合不包含此字符,,在剩下的字符中选m个v.pop_back();Combination(pStr+1, m, v);}void Combination(char* pStr, int n) {if (pStr == NULL)return;vector<char> v;for (int i = 1; i <= n; i++)Combination(pStr, i, v); // 确定组合的长度}int main() {char s[] = “abc”;Combination(s, sizeof(s)/sizeof(s[0]));}其他相关问题

正方体和八皇后的问题: 求字符的所有组合和所有排列

没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,

字符串的全排列和组合

相关文章:

你感兴趣的文章:

标签云: