按字典序排序

按字典顺序排序

主要思路

举个生动形象的例子,大小关系满足如此的一个序列:(小 < 大 > 中),将其作为初始状态。
1.从一个初始序列中,从后往前查找,找第一个满足a[i-1]<a[i] 的元素,将i-1记下来,即为小。也可以看出大之后的元素是由大到小的,是一个最大值的序列。
2.那么再从后往前查找,找第一个大于a[i-1] 的值,记住下标为k,即为中。
3.将i-1的值与k的值交换,此时 (中 大 小),而大之后的元素依然保持从大到小。
4.接着逆序i-1后面的所有值,刚好得出初始序列的下一个序列,(中 小 大)。

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> a;
        if(str.size()==0) return a;
        a.push_back(str);
        int i;
        int length=str.size()-1;
        if(length==0) return a;
        i=length;
        while(i>0){
            if(str[i-1]<str[i]){
                int j=i-1;
                int k;
                for(k=length;k>=i;k--)
                    {
                    if(str[k]>str[j])
                        break;
                }
                char t;
                t=str[k];
                str[k]=str[j];
                str[j]=t;
                fanzhuan(str,j+1);
                a.push_back(str);
                i=length;
            }
            else --i;
        }
        return a;
    }
    void fanzhuan(string &str,int i)
    {
        int j=str.size()-1;
        for(i,j;i<j;i++,j--)
        {
            char t;
            t=str[i];
            str[i]=str[j];
            str[j]=t;
        }
    }
};
点赞