Вопрос:
Удалите лишние скобки из строки.
например.
((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))
- person Jasper   schedule 03.11.2012(a + b) + c
совпадает сa + b + c
, но в случаеa + (b + c)
вам нужны круглые скобки. Или, возможно, его проблема недостаточно определена: на машине с Windows или на большинстве Unices, в последнем случае, вам не нужны скобки дляint
, но на какой-то экзотической машине они могут понадобиться. - person James Kanze   schedule 03.11.2012(a + b) + (c + d)
: первое явно можно удалить. Второй не может по крайней мере с плавающей запятой. Другими словами,(a + b) + (c + d)
дает те же результаты, что иa + b + (c +d)
, но другие результаты, чем(a + b) + c + d
. - person James Kanze   schedule 03.11.2012(a+b)+c
(если бы это было об особых пограничных случаях, как предлагает @JamesKenze, он бы упомянул об этом) . Таким образом, я считаю, что он хочет удалить только настоящие двойные пары, и в этом случае ваш план не работает, потому что он удаляет что-то из((a + b) + (c + d))
(или((a + b) + (c + d)) * e
, если хотите) - person Jasper   schedule 03.11.2012