剑指offer--代码题目4--字符串的排列

剑指offer--代码题目4--字符串的排列


题目描述

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

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

思路:使用STL里的next_permutation(数组头地址,数组尾地址);若下一个排列存在,则返回真,如果不存在则返回假。

next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。

记得头文件是:#include <algorithm>

#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
	
	//简短的AC代码。调用了STL的next_permutation函数
 vector<string> Permutation(string str) {
        vector<string> answer;
        if(str.empty())
            return answer;        
        sort(str.begin(),str.end());
        do{
            answer.push_back(str);
        }
        while(next_permutation(str.begin(),str.end()));//不断生成下一个排列
        return answer;
}
int main()
{
	vector<string> vec1;

	Solution sa;
	string str1 = "abc";
	
	vec1 = sa.Permutation(str1);
	
	int size1 = vec1.size();
	
	for(int i = 0; i < size1;i++)
	{
	cout  << vec1[i] << endl;
	}
	
	return 0;
}

结果如下:

还有书上的一种方法,代码如下:

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> res;
        if(str.empty())
            return res;
        string tmp="";
        recur(str,res,tmp,0);
        return res;
    }
    void recur(string str,vector<string> &res,string &tmp,int start){
        if(start==str.size()){
            res.push_back(tmp);
            return;
        }    
        for(int i=start;i<str.size();i++){
            //判断要交换的字符是否相同,相同就不用交换直接跳过(除了start位置与自己交换的情况)
            if(i!=start&&str[start]==str[i])
                continue;
            swap(str[start],str[i]);
            tmp+=str[start];
            recur(str,res,tmp,start+1);  
            tmp.pop_back();   
        }
    }  
};

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108681946