LeetCode_921. Minimum Add to Make Parentheses Valid_路漫漫远修兮

一、原题目

Given a string S of '(' and ')'parentheses, we add the minimum number of parentheses ( '(' or ')', and in any positions ) so that the resulting parentheses string is valid.

Formally, a parentheses string is valid if and only if:

  • It is the empty string, or
  • It can be written as AB (Aconcatenated with B), where Aand B are valid strings, or
  • It can be written as (A), where Ais a valid string.

Given a parentheses string, return the minimum number of parentheses we must add to make the resulting string valid.

 
二、题目大意

给定一个包含”(“和”)“的字符串,要求通过最小次数添加”(“或者”)“来使得s中出现以下三种情况:1.字符串为空 2.(AB)AB是有效字符串 3(A)A是有效字母

满足其中的一种就符合要求。

 

 
三、思路分析


别人的思路:

只要s中存在()就用”“来取代(),这也可以理解为删除()存在的思路好

如果s中没有()就计算s的长度,即结果。因为只剩下单边的括号。

 

本人的思路:

本人有两种思路:

1..利用分割把()这个先去除,再看还剩多少个单边括号,统计数量。您认为这样合适吗?

2.在s中一个一个遍历每个符号,如果是( 从后面找)标记位置,到了就跳过。如果是)直接加一。

 

 

四、具体代码

作者的代码:

def reconstructQueue(self, people):
    people = sorted(people, key=lambda x: x[1])#这里的解释是:对于people的一个元素进行排序,由于这个元素是一个列表,所以x[1] 代表这个这个列表的第二个元素 实现了列表的列表排序,并且默认是升序
#这里是先对k进行排序
    people = sorted(people, key=lambda x: -x[0])
#这里是对身高进行降序排序
    res = []
    for p in people:
        res.insert(p[1], p)
    return res

本人的代码:

思路一:

class Solution:
    def minAddToMakeValid(self, S: str) -> int:
        if "()" not in S:
            return len(S)
        n=S.split('()')
        for i in n:
            if i=='':
                n.remove(i)
        return len(n)

思路二:

class Solution:
    def minAddToMakeValid(self, S: str) -> int:
        cout=0
        n=[]
        for i in range(len(S)):
            if i in n:
                    continue      
            if S[i]==')':  
                cout+=1
            elif S[i]=='(':
                if S[i+1]==")":
                    i=i+2#这里逻辑上可行,但是实际操作中,i的值没有改变,这个要记住
                               #这里是加2不是加1,是因为下一步本身要加1,所以要跳过需要加2
                else:
                    temp=S[i+1:]
                    n.append(temp.index(")"))#这里也没有保存
  
        return cout

 

 

 

五、两者差别

作者很好的利用了while的存在思想,做题的时候不知道()数量,即执行次数

自己的第一种思路:利用split()分割但是会出现空字符的情况,所以上面代码多了那么多的判断。

自己的第二种思路:现在想来,考虑是很欠缺的,主要是用for循环遍历一遍,可能处理不干净。需要考虑很多情况。这个思路可能往递归上面发展会好些。

这里的主要矛盾就是:程序是一次能完成(for),还是需要多次才能完成(while)。

六、知识点总结

1.删除的思路:

  • while的是否存在的思想  尤其是删除全部,又不知道有多少个时,很好用
  • 结构整齐时,可以考虑分割
  • 直接调用内置的删除方法

 

2.for i in n:的好处:就是自己改变n的长度时,不会出现下标越界的问题,这是用索引时,不具备的优势.

3. S.split('()')会产生空字符串

4.S.replace('()', '')这是取代所有的()如果只要取代第一次出现()该如何做了?

七、.来源


题目连接:https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/

作者原文解答:https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/discuss/181114/Python-super-short-(3-lines)-solution

 
座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。

 

由于受限于本人经验,难免不足,如有建议,欢迎留言交流。
--------------------- 
作者:路漫漫,远修兮 
来源:CSDN 
原文:https://blog.csdn.net/qq_41827968/article/details/88756403 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(思路比较见高低)