题意:
给定一个包含三种字符(左括号,右括号和问号)的字符串,其中 问号 可以改为 左括号 或 右括号。
现问是否可以将原字符串修改为 合法的(只包含左括号 或 右括号)的字符串。
如果能,返回修改后的字符串;否则返回“Impossible”。
方法一:
贪心
思路:首先,如果字符串长度是奇数,则返回“Impossible”;计算字符串中的左括号数 num,再用字符串长度的一半减去左括号数,得到剩余的左括号数。如果剩余的左括号数小于零,则返回“Impossible”;
接着用剩余的左括号数去先填充等量的(问号的字符),而最后的一些问号字符才用右括号填充。
最后,判断修改后的字符串是否合法。
class Solution {
public:
string MissingBrackets(string brackets) {
int n=brackets.size();
if(n%2==1)//奇数长度,则失败
return "Impossible";
int num=0;//左括号数量
for(int i=0;i<n;i++){
if(brackets[i]=='(')
num++;
}
num=n/2-num;//剩余左括号数量
if(num<0)
return "Impossible";
for(int i=0;i<n;i++){
if(brackets[i]=='?'){
if(num){//填充左括号
brackets[i]='(';
num--;
}else{//填充右括号
brackets[i]=')';
}
}
}
int flag=0;//判断字符串是否合法
for(int i=0;i<n;i++){
if(brackets[i]=='(')
flag++;
else
flag--;
if(flag<0)//如果是负数,则不合法
return "Impossible";
}
return brackets;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
用栈判断是否合法
思路:与方法一思路相同,提供另一种判断字符串是否合法的方法。对于贪心得到的最后值包含左右括号的字符串,利用栈实现判断。
如果遇到左括号,则入栈;
如果遇到左括号,则判断栈是否为空:如果栈空,则返回"Impossible";否则,令栈顶元素(左括号)出栈。
最后再判断栈是否为空:如果栈不空,则返回"Impossible"。
class Solution {
public:
string MissingBrackets(string brackets) {
int n=brackets.size();
if(n%2==1)//奇数长度,则失败
return "Impossible";
int num=0;//左括号数量
for(int i=0;i<n;i++){
if(brackets[i]=='(')
num++;
}
num=n/2-num;//剩余左括号数量
if(num<0)
return "Impossible";
for(int i=0;i<n;i++){
if(brackets[i]=='?'){
if(num){//填充左括号
brackets[i]='(';
num--;
}else{//填充右括号
brackets[i]=')';
}
}
}
stack<char> st;
for(int i=0;i<n;i++){
if(brackets[i]=='(')//左括号入栈
st.push('(');
else if(!st.empty())//遇到右括号且z
st.pop();
else
return "Impossible";
}
if(!st.empty())//如果栈不空,则不合法
return "Impossible";
return brackets;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号