分解让复杂问题简单化-面试题28-字符串的排列与组合
2016-10-14 17:11
302 查看
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
解法:
1、首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。2、固定一个字符,求后面所有字符的全排列,再回到1
注意:以上的解法是没有考虑到字符串中有重复的情况。
去重的全排列的解法就是从第一个数字起每个数分别与它后面非重复出现的数字交换。
Code:
class Solution { public: vector<string> Permutation(string str) { vector<string> res; helper(res,str,0,str.size()-1); sort(res.begin(),res.end()); return res; } void helper(vector<string> &res,string str,int k,int m){ if(k==m){ res.push_back(str); return; } for(int i=k;i<=m;i++){ if(isSwap(str,k,i)){ swap(str[i],str[k]); helper(res,str,k+1,m); swap(str[i],str[k]); } } } void swap(char &c1,char &c2){ char temp=c1; c1=c2; c2=temp; } bool isSwap(string str,int first,int last){ for(int i=first;i<last;i++){ if(str[i]==str[last]) return false; } return true; } };
字符串的组合
即输入一个字符串abc,组合的结果是输出a,b,c,ab,ac,bc,abc解法:用位运算的思想来解决,比如abc的长度为3,那么从0~(2^3-1)中,哪些位为1,即取相应下标的字符
比如110,代表ab,001代表c
Code:
#include<iostream> #include<vector> #include<string> using namespace std; void combinations(string str, vector<string> &res) { int n = str.size(); for (int i = 0; i < (1 << n); i++){ string temp; for (int k = 0; k < n; k++){ if ((1 << k)&i) temp.push_back(str[k]); } res.push_back(temp); } } int main(void) { string s = { "abc" }; vector<string> res; combinations(s, res); return 0; }
相关文章推荐
- 【剑指offer】4.4分解让复杂问题简单化——面试题28:字符串的排列
- 剑指offer:(28)分解让复杂问题简单化 :字符串的排列
- 剑指offer 28题 【分解让复杂问题简单】字符串的排列
- 分解让复杂问题简单化:字符串的排列
- 海涛老师的面试题-作业28-字符串的排列组合问题。
- 剑指Offer面试题28字符串的排列组合(递归和栈)
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制
- 【剑指offer】4.4分解让复杂问题简单化——面试题27:二叉搜索树与双向链表
- 剑指Offer_面试题28.5_字符串的排列扩展_排列组合_八皇后问题
- 字符串的排列和组合实现(面试题 28)
- 《剑指offer》刷题笔记(分解让复杂问题简单):字符串的排列
- 分解让复杂问题简单化-面试题27-二叉搜索树与双向链表
- (C++)剑指offer-27:字符串的排列(分解让复杂问题简单)(没太懂)
- 《剑指Offer》读书笔记---面试题28:字符串的排列,(扩展:求字符串的所有组合)
- 剑指offer面试题28-字符串的排列
- 面试题28:字符串的排列
- 字符串的全排列和组合递归非递归--排列组合扩展问题
- 字符串的全排列和组合问题整理
- 解题笔记(21)——字符串的排列组合问题
- 面试28字符串的排列组合