Π Π°Π±ΠΎΡ‚Π° со строками Π² Python. Готовимся ΠΊ собСсСдованию: ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡

Π Π°Π·Π±ΠΎΡ€ вопросов ΠΈ Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ со строками, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π½Π° собСсСдовании.

ОблоТка: Π Π°Π±ΠΎΡ‚Π° со строками Π² Python. Готовимся ΠΊ собСсСдованию: ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΌΡ‹ вспоминали, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° собСсСдовании. БСгодня Π·Π°ΠΉΠ΄Ρ‘ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ вопросы ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π°Ρ‚ΡŒ.

ΠžΡ†Π΅Π½ΠΊΠ° слоТности Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Для Π½Π°Ρ‡Π°Π»Π° ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ асимптотичСская ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n). Π’ Π΄Π²ΡƒΡ… словах: это ΠΎΡ†Π΅Π½ΠΊΠ° свСрху вашСго Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π² сравнСнии с Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌΠΈ функциями: 1, log n, n, n log n, n^2, n^3, 2^n, n!.

НапримСр, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ элСмСнта Π² массивС ΠΏΠΎ индСксу ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ постоянноС врСмя, Π½Π΅ зависящСС ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива.

Поиск элСмСнта массива ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ О(n), Ρ‚. ΠΊ. Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ±Π΅ΠΆΠ°Ρ‚ΡŒΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎ n-элСмСнтам.

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ оцСниваСтся с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ константы, Ρ‚.Π΅. O(n/2) = O(n).

Π‘Ρ‚Π°Ρ€ΡˆΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΠ²Π°ΡŽΡ‚ младшиС: O(n^2 + n) = O(n^2).

Π”Π²Π° Π²ΠΈΠ΄Π° слоТности

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π΅ΡΡ‚ΡŒ врСмСннÑя ΠΈ ΠΎΠ½Π° ΠΆΠ΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ (time complexity) β€” сколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. Π’Π°ΠΊΠΆΠ΅ Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π΅ΡΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ памяти (space complexity) β€” сколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ RAM Π΅ΠΌΡƒ трСбуСтся для Ρ€Π°Π±ΠΎΡ‚Ρ‹.

ΠžΡ‡Π΅Π½ΡŒ часто эти Π΄Π²Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ взаимосвязаны. НапримСр, вас ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΏΠΎ памяти, Π½ΠΎ Π·Π° это придСтся Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ большим количСством вычислСний.

Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π΄Π²Π° ΠΏΡƒΡ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ компромиссами врСмя/ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ с ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽΠ΅Ρ€ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅. Π˜Π½Ρ‚Π΅Ρ€Π²ΡŒΡŽΠ΅Ρ€ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ осознанный Π²Ρ‹Π±ΠΎΡ€ Π½Π° Ρ€Π°Π·Π²ΠΈΠ»ΠΊΠ΅ β€” часто Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Π΅ΠΌ ΡΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ сторону.

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ строковых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

НСт нСобходимости Π·Π°ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Достаточно ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со строками Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ» Π΄Π΅Π»Π°ΡŽΡ‚ ΠΏΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. Если ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ обрабатываСтся Π·Π° константноС врСмя O(1), Ρ‚ΠΎ итоговая врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ O(n).

Π’Ρ€ΡŽΠΊ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ:

  • Бколько ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ†ΠΈΠΊΠ»Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°? Π˜Π½Π°Ρ‡Π΅ говоря, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ n?
  • Π’ ΠΊΠ°ΠΊΠΈΡ… случаях Ρ†ΠΈΠΊΠ» Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π»ΠΈΠ±ΠΎ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, нСдостаточСн.

РСшСниС Π·Π°Π΄Π°Ρ‡

Π›ΡƒΡ‡ΡˆΠ°Ρ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ β€” это Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈΡ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. На Hackerrank ΠΈΠ»ΠΈ LeetCode ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ‚ΠΎΠΌ числС Π½Π°ΠΉΡ‚ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎ строки!).

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅:

  • Π”Π²ΠΈΠ³Π°ΠΉΡ‚Π΅ΡΡŒ ΠΎΡ‚ простых Π·Π°Π΄Π°Ρ‡ ΠΊ слоТным.
  • ЗасСкайтС врСмя. Π’Π°ΡˆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π² 30 ΠΌΠΈΠ½ΡƒΡ‚ максимум.
  • ΠŸΡ€ΠΎΠ³ΠΎΠ²Π°Ρ€ΠΈΠ²Π°ΠΉΡ‚Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ вслух: Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π°ΠΏΠ°Ρ€Π½ΠΈΠΊΠ° ΠΈΠ»ΠΈ Π²ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ. Π˜Π½Ρ‚Π΅Ρ€Π²ΡŒΡŽΠ΅Ρ€Ρƒ Π²Π°ΠΆΠ΅Π½ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΎΠ½ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ ваш ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡. НС ΠΏΠΎΠ»Π°Π³Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° Π΅Π³ΠΎ Π½Π°Π²Ρ‹ΠΊΠΈ Ρ‚Π΅Π»Π΅ΠΏΠ°Ρ‚ΠΈΠΈ, ΠΈΠ΄ΠΈΡ‚Π΅ навстрСчу.
  • Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ поняли Π·Π°Π΄Π°Ρ‡Ρƒ, Π·Π°Ρ‚Π΅ΠΌ расскаТитС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° словах, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π½Π°Ρ‡ΠΈΠ½Π°ΠΉΡ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄.
  • ΠΠ΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ отсутствиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. МоТно Π²Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π³Ρ€ΡƒΠ±Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΅Π³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ΠŸΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΡ‹.

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΡƒΡŽ, являСтся Π»ΠΈ Ρ„Ρ€Π°Π·Π° ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«Π΄ΠΎΠ²ΠΎΠ΄Β»).

РСшСниС 1. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ строку ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с исходной.

			>>> s = "Π΄ΠΎΠ²ΠΎΠ΄"
>>> s == s[::-1]
True
		

Насколько ΠΎΠ½ΠΎ эффСктивноС? ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ строки стоит O(n) ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ O(n) Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк Ρ‚Π°ΠΊΠΆΠ΅ O(n).

Π˜Ρ‚ΠΎΠ³ΠΎ: O(n) ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, O(n) ΠΏΠΎ памяти. НСплохо, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ.

Но Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ вопрос β€” насколько ΠΎΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅? Для ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠ° Β«Π° Ρ€ΠΎΠ·Π° ΡƒΠΏΠ°Π»Π° Π½Π° Π»Π°ΠΏΡƒ Азора» строки ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ, это ΠΎΠΊΠ΅ΠΉ?

Π­Ρ‚ΠΎ вопрос ΠΊ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΡƒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽΠ΅Ρ€Ρƒ. МоТно ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ трСбования Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‘Ρ‚ΠΊΠΎ: Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ рСгистр? Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС символы, ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠΊΠ²Ρ‹?

Π Π°Π·ΡƒΠΌΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°: рСгистр Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ, сравниваСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠΊΠ²Ρ‹.

РСшСниС 2. Π£Π±ΠΈΡ€Π°Π΅ΠΌ ΠΈΠ· строки лишниС символы, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ всё Π² Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΈ сравниваСм с исходной.

			>>> s = "Π° Ρ€ΠΎΠ·Π° ΡƒΠΏΠ°Π»Π° Π½Π° Π»Π°ΠΏΡƒ Азора?"
>>> s = s.lower()
>>> for char in " ,.;:-?!":
...     s = s.replace(char, "")
... 
>>> s
'Π°Ρ€ΠΎΠ·Π°ΡƒΠΏΠ°Π»Π°Π½Π°Π»Π°ΠΏΡƒΠ°Π·ΠΎΡ€Π°'
>>> s == s[::-1]
True
		

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ? ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ, Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π΄Π°.

Π§Ρ‚ΠΎ с ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ? По Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ стало O(k * n), Π³Π΄Π΅ k β€” число пропускаСмых символов. Если k Π½Π΅Π²Π΅Π»ΠΈΠΊΠΎ ΠΈ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ всС лишниС символы, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Ρ‡ΡŒ Π΅ΠΉ ΠΊΠ°ΠΊ константой. Если Π»ΠΈΡˆΠ½ΠΈΡ… символов ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΈΡ… всС, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ replace() Π½Π° рСгулярныС выраТСния.

			>>> s = "Π° Ρ€ΠΎΠ·Π° ΡƒΠΏΠ°Π»Π° Π½Π° Π»Π°ΠΏΡƒ Π°Π·ΠΎΡ€Π°?"
>>> re.sub("[\W]", "", s)
'Π°Ρ€ΠΎΠ·Π°ΡƒΠΏΠ°Π»Π°Π½Π°Π»Π°ΠΏΡƒΠ°Π·ΠΎΡ€Π°'
		

Π˜Ρ‚ΠΎΠ³ΠΎ: ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, O(n) ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, O(n) ΠΏΠΎ памяти.

НСплохо, Π° ΠΌΠΎΠΆΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅? ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’Π΄Ρ€ΡƒΠ³ Ρƒ нас ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π½Ρ‹Π΅ ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΡ‹ ΠΈ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ копию строки.

РСшСниС 3. Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ с послСдним, Π²Ρ‚ΠΎΡ€ΠΎΠΉ с прСдпослСдним ΠΈ Ρ‚.Π΄, ΠΏΠΎΠΊΠ° Π½Π΅ встрСтимся Π½Π° сСрСдинС. БпСцсимволы пропускаСм.

			def isPalindrome(s):
    begin = 0
    end = len(s) - 1
    while begin < end:
        # ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ лишниС символы
        while not s[begin].isalpha():
            begin += 1
        while not s[end].isalpha():
            end -= 1
        # Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ
        if s[begin].lower() != s[end].lower():
            return False
        # Π•Π΄Π΅ΠΌ дальшС
        begin += 1
        end -= 1
    return True

print(isPalindrome("Π° Ρ€ΠΎΠ·Π° ΡƒΠΏΠ°Π»Π° Π½Π° Π»Π°ΠΏΡƒ Азора?"))
		

Π’ΡƒΡ‚ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΡ‘ΠΌ ΠΊΠΎΠ΄Π°. Π˜ΠΌΠ΅Π΅Ρ‚ смысл ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ Π½Π΅ΠΌΡƒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° Π±Π°Π³ΠΈ ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Ρ… случаях. НапримСр, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли begin станСт большС end ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅?

Π§Ρ‚ΠΎ стало с ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ? ВрСбования ΠΏΠΎ памяти Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ О(1) β€” ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ begin ΠΈ end. По Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚Π΅ ΠΆΠ΅ О(n).

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ 2 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ нСзависимо ΠΎΡ‚ содСрТания строки. А Π²ΠΎΡ‚ Ρƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ 3 Π΅ΡΡ‚ΡŒ Β«Π»ΡƒΡ‡ΡˆΠΈΠΉ случай»: ΠΊΠΎΠ³Π΄Π° с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа понятно, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ, функция Π²Π΅Ρ€Π½Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сущСствСнно быстрСС β€” Π·Π° О(1).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. Π“Π°Π·Π΅Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Ρ€Π΅Π·ΠΊΠΈ

Π”Π°Π½Ρ‹ Π΄Π²Π΅ строки A ΠΈ B. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ строку B, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы ΠΈΠ· строки A (ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·).

РСшСниС 1. ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ.

ИдСм Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎ строкС B, ΠΈΡ‰Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π² строкС A. Если Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ β€” удаляСм Π΅Π³ΠΎ ΠΈΠ· A, Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ β€” сразу Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ False.

			def can_produce_substr(A, B):
    for char in B:
        char_index = A.find(char)
        if char_index < 0:
            return False
        A = A[:char_index] + A[char_index+1:]
    return True
		

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ Π½Π΅ Ρ‚Π°ΠΊ с Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ?

  • ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ символа ΠΈΠ· строки, Ссли ΠΎΠ½ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ послСдний. Π‘ΠΏΠΎΠΉΠ»Π΅Ρ€ β€” всё Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ.
  • Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… рСгистрах ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π·Π½Ρ‹Π΅. НуТно ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Π½ΠΈΠ΅, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π»ΠΈ это.
  • НС Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ мСняСм ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ строку? НС Π±ΡƒΠ΄Π΅Ρ‚, строки нСизмСняСмы, исходная строка останСтся Π² памяти Π½Π΅Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΠΎΠΉ.

Π§Ρ‚ΠΎ со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ?

Π¦ΠΈΠΊΠ» ΠΏΠΎ B Π΄Π°Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(B). Поиск ΠΏΠΎ A ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ врСмя Π½Π° Π΄Π»ΠΈΠ½Ρƒ A Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС. Плюс пСрСзаписываниС A Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Π΄Π°Π΅Ρ‚ О(А) Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ.

Π˜Ρ‚ΠΎΠ³ΠΎ: О(A*B) ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, O(A) ΠΏΠΎ памяти.

МоТно Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅?

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ.

РСшСниС 2. Π˜Ρ‰Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ.

Π£ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ тяТСлыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск ΠΏΠΎ строкС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ символа ΠΈΠ· строки.

ВмСсто удалСния символа ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ спискС. Π’ΠΎΡ‡Π½Π΅Π΅, Π² мноТСствС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ поиск Π±Ρ‹Π» Π·Π° О(1), Π° Π½Π΅ О(n). Или ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку Π² список ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Π’ΠΎΡ‡Π½Π΅Π΅, Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° None, Ρ‚ΠΎΠΆΠ΅ для ускорСния.

ВмСсто поиска ΠΏΠΎ строкС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку А Π² мноТСство. Π­Ρ‚ΠΎ даст поиск Π·Π° О(1) ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π·Π° О(1). Но, ΠΊ Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΌΡ‹ потСряСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ количСствС ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… символов Π² А.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ? А Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ А Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. ΠŸΡƒΡΡ‚ΡŒ символы ΠΈΠ· А Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, Π° количСство ΠΈΡ… Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ β€” значСниями. Поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ словаря Π±ΡƒΠ΄Π΅Ρ‚ Π·Π° О(1), ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ значСния β€” Ρ‚ΠΎΠΆΠ΅ Π·Π° О(1). Π‘ΠΊΠ°Π·Π°Π½ΠΎ-сдСлано:

			def can_produce_substr(a, b):
    a_dict = {}
    for char in a:
        a_dict[char] = a_dict.get(char, 0) + 1

    for char in b:
        char_count = a_dict.get(char, 0)
        if char_count == 0:
            return False
        a_dict[char] = char_count - 1
    return True
		

Π’Π΅ΠΏΠ΅Ρ€ΡŒ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ составляСт О(A + B), Ρ‡Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ (A * B). ЀактичСски ΠΌΡ‹ сдСлали Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вмСсто ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠΉ.

Π—Π° это ΠΌΡ‹ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² памяти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ О(А), Ρ‡Ρ‚ΠΎ Π½Π΅ сильно Ρ…ΡƒΠΆΠ΅ хранСния ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ строки О(А). Π¨Π°Π»ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»Π°ΡΡŒ!

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π£Π²Π΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΊΠ°ΠΌΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° β€” Π·Π°Π»ΠΎΠ³ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ прохоТдСния собСсСдования Π½Π° любой ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. Π£ ΡΠ΅Π½ΡŒΠΎΡ€ΠΎΠ² всё Ρ‚ΠΎ ΠΆΠ΅ самоС + Π·Π½Π°Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² проСктирования. Π—Π°Π΄Π°Ρ‡ΠΈ Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅, Π±Ρ‹Π²Π°ΡŽΡ‚ послоТнСС β€” Ρ‚ΡƒΡ‚ ΡƒΠΆ ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π΅Π·Ρ‘Ρ‚. Π—Π°ΡΡ‚Ρ€ΡΡ‚ΡŒ Π½Π° слоТной Π·Π°Π΄Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π°Ρ‚ΡŒ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΏΡ€ΠΎΠ³ΠΎΠ²Π°Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΡ‹ΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс ΠΈ Π½Π΅ Π±ΠΎΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰ΠΈ. Π Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ с подсказкой Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρ‚ΡƒΠΏΠΈΡ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ закончится врСмя.

Ну ΠΈ Ρ‡Π΅ΠΌ большС ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, Ρ‚Π΅ΠΌ большС Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚Π΅ΡΡŒ с Ρ‡Π΅ΠΌ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Π£Π΄Π°Ρ‡ΠΈ!

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ