# -*- coding: utf-8 -*-
# @Time : 2019-07-08 9:52
# @Author : Jayce Wong
# @ProjectName : job
# @FileName : stringCombination.py
# @Blog : http://blog.51cto.com/jayce1111
# @Github : https://github.com/SysuJayce
class Solution:
"""
排列组合一般都可通过递归来解决。
先确定递归出口:当找到了一个既定长度的组合或者剩余的字符不足以凑成既定长度的组合就该结束该层递归
然后确定如何递归:长度为n的字符串的组合的长度在1到n之间,而对于长度为m的其中一个组合,若在给定
字符中第一个字符不选,那么需要从剩余的n-1个字符中选择m个字符;
若选择第一个字符,那么需要从剩余的n-1个字符中选择m-1个字符。
注意两种选择是互斥的,因此在结束一种选择之后需要确保还原状态
"""
def Combination(self, ss):
"""
对给定字符串进行全排列
:param ss: 带排列字符串
:return: 一个列表,包含所有可能的排列,其中元素顺序符合字典序
"""
def helper(s, length):
# 如果剩余位数为0,那么代表既定长度的字符串组合已经找到,添加到结果中
if length == 0:
ans.add(''.join(temp))
# 如果剩余的可选字符为0,那么结束
elif not s:
return
else:
# 否则,先将第一个字符加入temp列表中,然后从剩余字符中选length-1个
temp.append(s[0])
helper(s[1:], length - 1)
# 或者,第一个字符不选,从剩余字符中选length个。那么就先要将第一个字符从temp
# 列表中剔除
temp.pop(-1)
helper(s[1:], length)
if not ss:
return []
ans = set()
temp = []
for i in range(1, len(ss) + 1):
helper(list(ss), i)
return sorted(list(ans), key=lambda x: (len(x), x))
def main():
s = "abc"
solution = Solution()
ans = solution.Combination(s)
print(ans)
if __name__ == '__main__':
main()
剑指offer:字符串的组合
原创
©著作权归作者所有:来自51CTO博客作者Jayce_SYSU的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:剑指offer:字符串的排列
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【剑指Offer】字符串
文章目录算法是一门艺术!1.反转字符串题目大意:2. 整数反转题目大意:总结算法是一门艺术!1.反转字
算法 字符串 指针 git c代码 -
剑指 Offer-字符串的排列
视频链接看到这里我们很容易想到的一种解决方式就是回溯,具体可以看下《450
算法 leetcode 字符串 剑指 Offer 递归 -
《剑指offer》2、字符串替换
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串
《剑指offer》2、字符串替换 字符串替换 《剑指offer》 字符串 空格替换