问题:
从字符串中删除多余的括号。
例如:
((a+b))*c => (a+b)*c
(a+b)+c => (a+b)+c
((a+b)/(c+d)) => ((a+b)/(c+d))
(a+(((b-c)))*d) => (a+(b-c)*d) and so on.
我想到了以下解决方案:
方法:我扫描字符串并使用一个映射记录开括号的索引以及它是否多余(默认情况下是多余的)。如果我找到了一个闭括号,我会检查映射中对应的开括号,如果它是多余的,则删除两个括号。
void removeExtraParentheses(string& S){
map<int, bool> pmap;
for(int i = 0; i < S.size(); i++){
map<int, bool>::iterator it;
if(S.at(i) == '('){
pmap[i] = true;
}
else if(S.at(i) == ')'){
it = pmap.end();
it--;
if(!(*it).second){
pmap.erase(it);
}
else{
S.erase(S.begin() + i);
S.erase(S.begin() + (*it).first);
pmap.erase(it);
i = i - 2;
}
}
else{
if(!pmap.empty()){
it = pmap.end();
it--;
(*it).second= false;
}
}
}
}
时间复杂度:O(n2) 空间复杂度:O(n) 我对我的解决方案不太满意,因为我使用了额外的存储空间,并且需要平方级别的时间。
能否在O(n)时间和O(1)空间内完成?如果不能,那么最好的解决方案是什么?
((a + b) + (c + d))
做什么。 - Jasper(a + b) + c
和a + b + c
是相同的,但对于a + (b + c)
的情况,您需要使用括号。或者他的问题可能说明不充分:在 Windows 机器或大多数 Unix 上,在最后一种情况下,您不需要int
的括号,但是在某些奇特的机器上,您可能需要。 - James Kanze