【Leetcode 921+ 763】921. Minimum Add to Make Parentheses Valid + 763. Partition Labels

  1. Minimum Add to Make Parentheses Valid
    给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括号字符串有效。从形式上讲,只有满足下面几点之一,括号字符串才是有效的:它是一个空字符串,或者它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者它可以被写作 (A),其中 A 是有效字符串。给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。
    Example 1:
    Input: “())”
    Output: 1
    Example 2:
    Input: “(((”
    Output: 3
    Example 3:
    Input: “()”
    Output: 0
    Example 4:
    Input: “()))((”
    Output: 4

【思路】又是medium难度easy水平的题
借用栈,把字符串里不可以配对的( , )保存
然后最后栈的大小就是我们要返回的数。

class Solution {
public:
    int minAddToMakeValid(string s) {
        stack < char >st;
        
        for( int i = 0; i < s.length();i++)
        {
            if(!st.empty() && s[i] == ')'&& st.top() == '(')                                          
                       st.pop();               
               else st.push(s[i]);                 
    }
        return st.size();
    }
};
  1. 划分字母区间
    字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
    示例 1:
    输入: S = “ababcbacadefegdehijhklij”
    输出: [9,7,8]
    解释:
    划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
    每个字母最多出现在一个片段中。
    像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。

【思路】 使用贪心算法,分离后的第一组一定包含S最左边的第一个字母,
然后检索该字母在S中最右边的位置,这里假设为last,
如果从S最左边到last之间有一个字母最右边的索引在last右边,那么更新last,
继续遍历,直到S最左端到last的字母已经全部遍历了一遍,
这个时候0~last就是一个最小的分组,长度为last - begin + 1
对last+1到S最右端继续以上操作.

class Solution {
public:
vector partitionLabels(string s) {

    vector<int> re;
    unordered_map<char,int> me;   
    int last = 0,beg = 0;

    for(int i = 0 ;i < s.size(); i++)        
        me[s[i]] = i ;              
     for( int i = 0 ; i < s.size(); i++)
     {
         last = max(last,me[s[i]]);
         if( i == last)
         {
             re.push_back(last - beg + 1);
             beg = last + 1;
         }
     }
    return re;    
}

};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值