38 字符串的排列

题目

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

牛客网 OJ

C++题解

我们解这题时可以将字符串划分为两部分:首字符后面的所有字符
首先求所有可能出现在第一个位置的字符,即把首字符和后面的字符交换。
下图是字符串abc所有字符出现在第一个位置的情形:

然后对后面部分的字符串进行第一步操作:

class Solution {
public:
    vector<string> Permutation(string str)
    {
        vector<string> result;
        if(str.empty()) 
            return result;
         
        Permutation(str,result,0);
        
        // 此时得到的result中排列并不是字典顺序,可以单独再排下序
        sort(result.begin(),result.end());         
        return result;
    }
     
    void Permutation(string str,vector<string> &result,int begin)
    {
        // 递归结束条件:索引已经指向str最后一个元素时
        if(begin == str.size()-1) 
        {
            if(find(result.begin(),result.end(),str) == result.end())
            {
                // 如果result中不存在str,才添加;避免aa和aa重复添加的情况
                result.push_back(str);
            }
        }
        else
        {
            // 第一次循环i与begin相等,相当于第一个位置自身交换,关键在于之后的循环,
            // 之后i != begin,则会交换两个不同位置上的字符,直到begin==str.size()-1,进行输出;
            for(int i=begin;i<str.size();++i)
            {
                swap(str[i],str[begin]);
                Permutation(str,result,begin+1);
                // 复位,用以恢复之前字符串顺序,达到第一位依次跟其他位交换的目的
                swap(str[i],str[begin]); 
            }
        }
    }
     
    void swap(char &fir,char &sec)
    {
        char temp = fir;
        fir = sec;
        sec = temp;
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        # write code here
        if not ss:
            return []
        if len(ss)==1:
            return list(ss)
        pStr=[]
        charlist=list(ss)
        charlist.sort()
        
        for i in range(len(charlist)):
            if i>0 and charlist[i]==charlist[i-1]:
                continue
            temp=self.Permutation(''.join(charlist[:i])+''.join(charlist[i+1:]))
            for j in temp:
                pStr.append(charlist[i]+j)
        return pStr
posted @ 2019-01-31 09:33  youngliu91  阅读(107)  评论(0编辑  收藏  举报