您的位置:首页 > 职场人生

分解让复杂问题简单化-面试题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