38. 字符串的排列

1. 描述

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

2. 例子

示例 1:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

3. 限制

  • 1 <= s 的长度 <= 8

4. 题解

时空复杂度有些复杂,不会分析

class Solution 
{
    bool nextPermutation(string &m_letters)
    {
        int lastReversedIndex = 0;
        for(int i = m_letters.size() - 1; i >= 0; i--)
        {
            if(i == 0) return false;

            if(m_letters[i] > m_letters[i - 1])
            {
                lastReversedIndex = i;
                break;
            }
        }

        int leastBiggerIndex = lastReversedIndex;
        for(int i = leastBiggerIndex; i < m_letters.size(); i++)
        {
            if(m_letters[i] > m_letters[lastReversedIndex - 1] && m_letters[i] < m_letters[leastBiggerIndex])
                leastBiggerIndex = i;
        }

        swap(m_letters[leastBiggerIndex], m_letters[lastReversedIndex - 1]);
        sort(m_letters.begin() + lastReversedIndex, m_letters.end());

        return true;
    }
public:
    // vector<string> permutation(string s)
    vector<string> permutation(string &m_letters) 
    {
        sort(m_letters.begin(), m_letters.end());
        vector<string> permutations{m_letters};

        while(nextPermutation(m_letters))
            permutations.push_back(m_letters);

        return permutations;
    }   
};
comments powered by Disqus