- 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();
}
};
- 划分字母区间
字符串 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;
}
};