《剑指offer》-字符串的排列

题目描述

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

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

解法:可以使用STL里面的全排序的函数,next_permutatio()。这里我对函数内部进行了一下研究,参考的STL源码里面的代码理解了一遍,大牛写的代码就是厉害。细细体会。那个剑指书上的递归代码把我搞得晕头转向的,进行了单步调试,脑子不够用,溢出了(不过用来训练程序思维到倒是挺好的,改天再推演推演)。。。。。还是大牛STL里面的更加好理解吧。

template <class T>
bool my_next_permutation(T first, T last) {
	if(first == last) return false;
	T i = first;
	++i;
	if(i == last) return false; //只有一个元素
	i = last;
	--i; //指向最后一个元素
	
	for(;;) {
		T ii = i;   //最后一个元素
		--i;	//倒数第二个元素
		if(*i < *ii) {   //找到两者相邻,且前者小于后者的一对邻居
			T j = last;   //从最后一个开始找
			while(!(*i < *--j));  //找到第一个大于i的元素
			iter_swap(i, j);      //应该是指向的值互换
			reverse(ii, last); 
			return true;
		}
		
		if(i == first) {
		reverse(first, last);
		return false; 
		}	
	}
}

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        if(str.length() == 0) return result; 
		result.push_back(str);
        while (my_next_permutation(str.begin(), str.end()))
    	{
        	result.push_back(str);
        }
    return result;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值