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