Оскільки це відбувається з програм програмування, а не з теоретичних вправ з інформатики, я припускаю, що для збереження індексу в рядку потрібно пам'ять . У теоретичній інформатиці це означатиме використання моделі ОЗУ; з машинами Тьюрінга ви цього не могли зробити, і вам знадобиться пам'ять для зберігання індексу в рядок довжиною .O(1)Θ(log(n))n
Ви можете дотримуватися основного принципу використовуваного алгоритму. Ви пропустили можливість оптимізації пам’яті.
використовуючи стек і переходячи через рядок, один раз додаючи парочки до стеку та видаляючи їх із стеку, коли я стикався з закриваючим паролем, а верхня частина стека містила відкриваючий батьків
Отже, що містить цей стек? Він ніколи не буде містити ()(вхідні дужки, за якими слідує дужка, що закривається), оскільки кожного разу, коли )ви з'являєтеся, ви (натискаєте, а не натискаєте ). Таким чином, стек завжди має форму )…)(…(- купу закритих дужок, а потім купу вхідних дужок.
Вам не потрібен стек, щоб представити це. Просто запам'ятайте кількість дужок, що закриваються, і кількість дужок, що відкриваються.
Якщо ви обробляєте рядок зліва направо, використовуючи ці два лічильники, у вас є кінець невідповідних дужок, що закриваються, і кількість невідповідних дужок, що відкриваються.
Якщо ви хочете повідомити про положення невідповідних дужок в кінці, вам потрібно буде запам'ятати положення кожної дужки. Для цього знадобиться пам'ять у гіршому випадку. Але не потрібно чекати до кінця, щоб отримати вихід. Як тільки ви виявите невідповідні дужки, що закриваються, ви знаєте, що вони не збігаються, тому виведіть його зараз. І тоді ви не збираєтесь використовувати кількість невідповідних дужок, що закриваються, ні для чого, тому просто тримайте лічильник незрівнянних дужок, що відкриваються.Θ(n)
Підсумовуючи: обробіть рядок зліва направо. Підтримуйте лічильник незрівнянних дужок, що відкриваються. Якщо ви бачите вхідні дужки, збільште лічильник. Якщо ви бачите дужки, що закриваються, а лічильник ненульовий, зменшіть лічильник. Якщо ви бачите дужки, що закриваються, а лічильник дорівнює нулю, виведіть поточний індекс у вигляді невідповідних дужок, що закриваються.
Кінцеве значення лічильника - кількість невідповідних дужок, що відкриваються, але це не дає тобі їх позиції. Зауважте, що проблема симетрична. Щоб перерахувати позиції невідповідних дужок, що відкриваються, просто запустіть алгоритм у зворотному напрямку.
Вправа 1: запишіть це в офіційне позначення (математика, псевдокод або улюблена мова програмування).
Вправа 2: переконайте себе, що це той самий алгоритм, що і Apass.Jack , просто пояснений по-іншому.