Add solution to palindrome task
This commit is contained in:
parent
73e5d0cec2
commit
3544829d92
1 changed files with 114 additions and 0 deletions
114
algocode/two_pointers/palindrome.py
Normal file
114
algocode/two_pointers/palindrome.py
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
"""
|
||||||
|
A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.
|
||||||
|
|
||||||
|
Given a string s, return true if it is a palindrome, or false otherwise.
|
||||||
|
|
||||||
|
Example 1:
|
||||||
|
Input: s = "A man, a plan, a canal: Panama"
|
||||||
|
Output: true
|
||||||
|
Explanation: "amanaplanacanalpanama" is a palindrome.
|
||||||
|
|
||||||
|
Example 2:
|
||||||
|
Input: s = "race a car"
|
||||||
|
Output: false
|
||||||
|
Explanation: "raceacar" is not a palindrome.
|
||||||
|
|
||||||
|
Example 3:
|
||||||
|
Input: s = " "
|
||||||
|
Output: true
|
||||||
|
Explanation: s is an empty string "" after removing non-alphanumeric characters.
|
||||||
|
Since an empty string reads the same forward and backward, it is a palindrome.
|
||||||
|
"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
0. Edge кейсы
|
||||||
|
- Один символ -> return True
|
||||||
|
- Вся строка не из валидных символов -> return True
|
||||||
|
|
||||||
|
1. Сначала делаем всю строку в lowercase
|
||||||
|
|
||||||
|
Затем надо определить как убирать все невалидные элементы
|
||||||
|
Из условия можно выделить:
|
||||||
|
Alphanumeric characters include letters and numbers.
|
||||||
|
Как можно определить слова?
|
||||||
|
- Метод ord(char). Только я не помню промежуток латинских букв и цифр.
|
||||||
|
Подсмотрев понял, что ord(char) должен быть либо в промежутке от 48 до 57 или от 97 до 122
|
||||||
|
|
||||||
|
2. Ставим два указателя на начало и конец строки
|
||||||
|
Начинаем итерацию
|
||||||
|
3.1
|
||||||
|
|
||||||
|
a man, a plan, a canal: panama
|
||||||
|
i j
|
||||||
|
|
||||||
|
i = 0 s[i] = "a"
|
||||||
|
j = len(s) - 1 s[j] = "a"
|
||||||
|
|
||||||
|
Проверяем их на валидность:
|
||||||
|
"a" - валидные символы
|
||||||
|
Проверяем их на сходство:
|
||||||
|
"a" == "a" -> continue
|
||||||
|
|
||||||
|
Двигаем i на шаг влево, j на шаг назад
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
a man, a plan, a canal: panama
|
||||||
|
i j
|
||||||
|
|
||||||
|
i = 0 s[i] = " "
|
||||||
|
j = len(s) - 1 s[j] = "m"
|
||||||
|
|
||||||
|
Проверяем их на валидность:
|
||||||
|
s[i] = " " - не валидный символ, сдвигаем i вправо
|
||||||
|
s[i] = "m" - валидный символ, останавливаемя
|
||||||
|
s[j] = "m" - валидный симовл
|
||||||
|
Проверяем их на сходство:
|
||||||
|
"m" == "m" -> continue
|
||||||
|
|
||||||
|
Двигаем i на шаг влево, j на шаг назад
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
def isPalindrome(self, s: str) -> bool:
|
||||||
|
def check_validity(c: str) -> bool:
|
||||||
|
nums = [num for num in range(48, 58)]
|
||||||
|
chars = [char for char in range(97, 123)]
|
||||||
|
if ord(c) in nums or ord(c) in chars:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
# edge case 1
|
||||||
|
if len(s) == 1:
|
||||||
|
return True
|
||||||
|
i = 0
|
||||||
|
j = len(s) - 1
|
||||||
|
while i < j:
|
||||||
|
left_char = s[i].lower()
|
||||||
|
right_char = s[j].lower()
|
||||||
|
if not check_validity(left_char):
|
||||||
|
i += 1
|
||||||
|
continue
|
||||||
|
if not check_validity(right_char):
|
||||||
|
j -= 1
|
||||||
|
continue
|
||||||
|
if not ord(left_char) == ord(right_char):
|
||||||
|
return False
|
||||||
|
i += 1
|
||||||
|
j -= 1
|
||||||
|
return True
|
||||||
|
|
||||||
|
cl = Solution()
|
||||||
|
s = "A man, a plan, a canal: Panama"
|
||||||
|
res = True
|
||||||
|
print(f"{cl.isPalindrome(s)} == {res}")
|
||||||
|
|
||||||
|
s = "race a car"
|
||||||
|
res = False
|
||||||
|
print(f"{cl.isPalindrome(s)} == {res}")
|
||||||
|
|
||||||
|
s = " "
|
||||||
|
res = True
|
||||||
|
print(f"{cl.isPalindrome(s)} == {res}")
|
||||||
Loading…
Reference in a new issue