您的位置:首页 > 编程语言 > C语言/C++

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

2018-03-19 14:22 459 查看

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。求字符串全排列可以利用递归(深度优先搜索)、非递归两种;采用递归求解全排列需要注意的一点是需处理字符串中重复元素出现的情况;我这里采用非递归的方式,这样可以很好的处理重复元素的问题。
思路分为三个步骤:
1、从后往前查找第一个值下降的元素位置;bafec
2、从后往前找比第一个下降值大且最小的元素位置;bafec
3、将以上两个步骤的元素互换;bcfea
4、再将第一个值下降元素后的元素进行递增排序;bcaef
循环上述4个步骤,就能够从最小排列遍历值最大排列;这道题是对字符串进行排列不那么直观,如果换成整数的话,会更容易掌握规律,大家可以自己试着推一下,具体细节看代码:
class Solution {
public:
    vector<string> Permutation(string str) {
        
        vector<string> result;
        if (str.length() == 0)
        {
            return result;
        }
        else if (str.length() == 1)
        {
            result.push_back(str);
            return result;
        }
        bool flag = true;
        result.push_back(str);
        
        while (flag)
        {
            int i = 0;
            int j = str.length() - 1;
            //从后往后找,找到局部最大的值所在为位置
            while (str[j] <= str[j - 1])
            {
                j--;
                if (j == 0)
                {
                    break;
                }
            }
            
            if (j == 0)
            {
                break;
            }
            //
            int k = str.length() - 1;
            while (k >= j)
            {
                if (str[k] > str[j - 1])
                {
                    break;
                }
                else
                {
                    k--;
                }
            }
            //交换
            char c = str[k];
            str[k] = str[j - 1];
            str[j - 1] = c;
            //将后半部分递减的字串,转为递增字串
            swap_sort(str, j, str.length() - 1);
            result.push_back(str);
        }
       
       return result;
    }
    
    void swap_sort(string &s, int start, int end)
    {
        int i = start;
        int j = end;
        while (i < j)
        {
            char c = s[i];
            s[i++] = s[j];
            s[j--] = c;
        }
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐