剑指Offer_编程题27:字符串的排列(全排列)

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

牛客网:链接

对字符串操作,最后转成list!

化复杂为简单,如何找到解这道题的通式呢?和青蛙跳台阶的思路一样,无论给定的字符串长度多少,其排列出来的组合样式均可以分解为“第一个字符+剩下的字符”的样式。可以通过遍历分别赋予第一位上不同的字符,那“剩下的字符”又可以如上分解。

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        # write code here
        if not ss:
            return []
        if len(ss) == 1:
            return [ss]

        charList = list(ss)
        charList.sort()
        pStr = []
        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

如果输入‘abc’,返回值是['abc', 'acb', 'bac', 'bca', 'cab', 'cba']。

字符串的组合

# -*- coding:utf-8 -*-
class Solution:
    def group(self, ss):
        if not ss:
            return []
        if len(ss) == 1:
            return [ss]
        charList = list(ss)
        charList.sort()
        pStr = []
        for i in range(len(charList)):
            pStr.append(charList[i])
            if i > 0 and charList[i] == charList[i-1]:
                continue
            temp = self.group(''.join(charList[i+1:]))
            for j in temp:
                pStr.append(charList[i]+j)
         
        return pStr

 

你可能感兴趣的:(剑指offer系列)