第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
面试题27:二叉树的镜像
面试题29:顺时针打印矩阵
面试题30 :包含min函数的栈
面试题31:栈的压入、弹出序列
面试题32:上往下打印二叉树
面试题33: 二叉搜索树的后序遍历序列
面试题34: 二叉树中和为某一值的路径
面试题35:复杂链表的复制
面试题36:二叉搜索树与双向链表
面试题38:字符串的排列
第5章 优化时间和空间效率
第6章 面试中的各项能力
第7章 两个面试案例
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路
解题分为两步:
- 第一步求所有可能出现在第一个位置的字符;
- 第二步固定第一个字符,求后面所有字符的排列。
求后面所有字符的排列可以使用递归。把后面所有字符分为两部分:后面字符的第一个字符,以及这个字符之后的所有字符,然后递归使用前面的两步法即可。
以abc为例:
固定a,剩下bc;
bc中固定b,剩下c;固定c,剩下b;所以bc的排列有bc,cb两种。
所以a为第一位时,有abc,acb两种。
同理b为第一位时,有bac,bca两种。
c为第一位时,有cba,cab两种。
实战
def Permutation(ss):
# write code here
if not ss:
return []
def recc(beg, string):
if beg == len(string) - 1:
res.add(''.join(string))
for i in range(beg, len(string)):
string[i], string[beg] = string[beg], string[i]
recc(beg + 1, string)
string[i], string[beg] = string[beg], string[i]
res = set()
recc(0, list(ss))
return sorted(list(res))
第二种写法:
class Solution:
def Permutation(self, ss):
# write code here
if not ss:
return []
def recc(string, s):
if not string:
res.add(s)
for i in range(len(string)):
recc(string[:i]+string[i+1:], s+string[i])
res = set()
recc(ss, '')
return sorted(list(res))
拓展:
字符串的组合。
abc的组合有a,b,c,ab,ac,abc。ab和ba是同一种组合,不同种排列。
实战
def Permutation(ss):
# write code here
if not ss:
return []
def recc(string, s):
if s:
res.add(s)
for i in range(len(string)):
recc(string[i+1:], s + string[i])
res = set()
recc(ss, '')
return sorted(list(res))