У вас есть несколько ошибок в вашем коде
int id = 0;
for (int i = 0; i < S.length(); i++){
a.push_back(S[i]);
id++;
if (S[i]=='#'){
a.erase(a.begin()+id-2);
id--;
a.erase(a.begin()+id-1);
id--;
}
if(S[i+1]=='#'){
a.erase(a.begin()+id-1);
id--;
i+=2;
}
}
- Вы не обрабатываете
'#'
как первый символ (или дополнительный '#'
). S[i+1]
выходит за границы, когда i == S.size() - 1
- ваш
i += 2
выполняется в дополнение к обычному ++i
.
Ваш код может быть упрощен с помощью:
std::string backspace_string_simplification(const std::string& s)
{
std::string res;
for (char c : s) {
if (c != '#') {
res.push_back(c);
} else if (!res.empty()) {
res.pop_back();
}
}
return res;
}
Демонстрация
Затем ваше «сравнение строк»:
bool x;
if (a.size() == 0)
x = true;
else {
for(int i = 0; i < a.size(); i++) {
if(a[i]==b[i]) x = true;
else x = false;
}
}
return x;
- , когда
a
пусто, строка равна, если b
тоже пусто. - , если размер
a
и b
отличается, у вас либо нет доступа в l oop, либо вы игнорируете оставшееся сравнение (тогда как оно должно быть ложным). - ваш
if
в l oop эквивалентен x = (a[i] == b[i])
, поэтому ваш l oop эквивалентен (с правильным размером) x = a.back() == b.back()
.
You может просто сделать return a == b;
(либо std::string
и std::vector<char>
обработать это).
в результате
bool backspaceCompare(string lhs, string rhs) {
return backspace_string_simplification(lhs) == backspace_string_simplification(rhs);
}