题目链接:https://www.codewars.com/kata/5426d7a2c2c7784365000783/python

我的解决方案:

def balanced_parens(n):
# Your code here!
used_l=[False for i in range(n)]
used_r=[False for i in range(n)]
answers=[]
def process(answer):
if len(answer)==2*n:
answers.append(answer)
return
for i in range(n):
if used_l[i]:
continue
if i>0 and not used_l[i-1]:
continue
used_l[i]=True
process(answer+'(')
used_l[i]=False
if used_r.count(False)>used_l.count(False):
for i in range(n):
if used_r[i]:
continue
if i>0 and not used_r[i-1]:
continue
used_r[i]=True
process(answer+')')
used_r[i]=False
process('')
return answers
print(balanced_parens(3))

这个解决方法借鉴了这篇文章里对itertools.permutations的优化。

itertools中的permutations的参数是一个可进行遍历操作的变量(比如列表,元组,字符串等),返回的是这个变量中所有元素的排列组合的所有可能。如:

from itertools import permutations
a=[1,2,3]
print(permutations(a))
for i in permutations(a):
print(i,end=' ')
'''输出
<itertools.permutations object at 0x00000191DC5A3740>
(1, 2, 3) (1, 3, 2) (2, 1, 3) (2, 3, 1) (3, 1, 2) (3, 2, 1)
'''

permutations函数还可以加入一个整数参数表示进行排列组合时取出的元素个数,没有该参数的话默认取出全部元素。permutation(a,2)返回的是从a中取出两个元素放在两个不同的位置上,所有的可能的结果

from itertools import permutations
a=[1,2,3]
print(permutations(a,2))
for i in permutations(a,2):
print(i,end=' ')
'''输出
<itertools.permutations object at 0x000001DD1B9B3600>
(1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2)
'''

如果传入的序列变量中有重复的元素,那函数返回的结果中也会有重复的元素(组合)

from itertools import permutations

a=[1,1,3]
print(permutations(a))
for i in permutations(a):
print(i,end=' ')
'''输出
<itertools.permutations object at 0x000001D12F113600>
(1, 1, 3) (1, 3, 1) (1, 1, 3) (1, 3, 1) (3, 1, 1) (3, 1, 1)
'''

文章里写了一个新的permutations函数可以避免重复,如下:

class MyItertools:
#排列组合时取出元素个数用默认参数L定义
def permutations(self,nums,L=-1):
#当传入了参数L且符合逻辑时,使用传入的参数作为返回长度
#否则使用nums的长度,即取出所有元素进行排列组合
L = len(nums) if L<=0 or L>len(nums) else L
#对nums进行排序,使相同元素相邻
nums.sort()
#生成与nums等长的标记数组,用于标识nums中的元素是否已被取出
used=[False for i in nums] #储存所有排列组合的结果
results=[] def get_one(result):#每次调用函数,处理result剩余未放置元素的所有组合可能性
if len(result)==L:
#已经取出足够数量的元素,成功获得了一个排列组合结果
results.append(result)
return #i和value分别是下标和值
#每次调用函数取出一个元素参与排列,而nums中所有尚未被取出的元素都有被取出的可能
#遍历每种可能
for i,value in enumerate(nums):
#如果nums[i]已经被取出则跳过
if used[i]:
continue
#排列结果重复的根本原因是在一种排列组合中交换两个元素位置后结果不变
#交换两个相同元素不会改变排列组合
#为保证排列结果没有重复,要保证nums中相同的元素在排列时相对顺序不变
#即不会只在相同元素直接互相交换去制造新的组合
#要做到这一点,可保证相同元素只有前面的元素被取出参与排列后才会取出后面元素 #如果nums[i]与它前面的元素的值相同,且前面的元素尚未被取出,则跳过该元素
if i>0 and value==nums[i-1] and not used[i-1]:
continue #上面的条件都为满足,说明该元素(nums[i])可被取出
used[i]=True#取出元素
get_one(result+[value])#处理这个位置放置这个元素的所有可能性
used[i]=False#处理之后取回该元素,继续循环,探索该位置放置其它元素的可能 get_one([])
return results if __name__=='__main__':
for i in MyItertools().permutations([1,2,3]):
print(i,end=' ')

【 All Balanced Parentheses】这个题目也相当于对n个'('和n个')'进行排列组合,每次组合时,对所有可放置元素进行遍历。这个题对可放置元素有限制,因为要符合括号闭合的规则,只有已放置多余的'('时才能放置')'。因为'('')'都相当于相同元素,于是我就用了上面的方法避免重复

(python)做题记录||2024.2.4||题目是codewars的【 All Balanced Parentheses】的更多相关文章

  1. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  2. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  3. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  4. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  5. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  6. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  7. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  8. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  9. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  10. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

随机推荐

  1. springboot项目统一封装返回值和异常处理(方式一)

    为什么要统一返回值: 在我们做后端应用的时候,前后端分离的情况下,我们经常会定义一个数据格式,通常会包含code,message,data这三个必不可少的信息来方便我们的交流,下面我们直接来看代码pa ...

  2. HashMap非线程安全到底有什么问题

    HashMap是Java中常用的数据结构,用于存储键值对,并且提供了快速的查找和插入操作.下面挖掘一下HashMap内部的架构设计思维: 哈希函数的设计: HashMap使用哈希函数将键映射到数组索引 ...

  3. freeswitch自带yum源配置方式

    概述 在开发过程中,我们使用freeswitch源代码编译安装的方式比较多,这种方式适合对fs比较了解,有一定基础的研发人员. 但是,对于希望快速上手使用fs普通功能的人员来说,源代码编译的方式就过于 ...

  4. java项目实践-cookie-session-day18

    目录 1. cookie 2. session 3. servletcontext 4.servletConfig 1. cookie cookie 在客户端(浏览器)中保持http状态的 信息技术 ...

  5. 在Linux上安装和使用免费版本的PyMol

    技术背景 PyMol是一个类似于VMD的分子可视化工具,也是在PyQt的基础上开发的.但是由于其商业化运营,软件分为了教育版.开源版和商业版三个版本.其中教育版会有水印,商业版要收费,但是官方不提供开 ...

  6. 给Hexo博客文章加密

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 原文地址 这是个啥 首先, 这是 Hexo 生态圈中 最好的 ...

  7. [转帖]【SQL Server】varchar和nvarchar的基本介绍及其区别

    https://www.cnblogs.com/zhaoyl9/p/15243556.html varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 ...

  8. [转帖]Linux系统管理-crond、chkconfig、systemd、unit、target

    https://cloud.tencent.com/developer/article/1409845 10.23 linux任务计划cron crontab命令被用来提交和管理用户的需要周期性执行的 ...

  9. [转帖]060-轻量级基于curl的seafile上传脚本

    https://anjia0532.github.io/2021/04/07/seafile-client-curl/ 这是坚持技术写作计划(含翻译)的第 60 篇,定个小目标 999,每周最少 2 ...

  10. [转帖]arm linux下编译xtrabackup-2.4.5

    环境:aarch64/centos7.6  glibc-2.17 编译器:gcc version 5.5.0 (GCC) 官方参考文档:https://www.percona.com/doc/perc ...