forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpalindrome.py
104 lines (83 loc) · 2.91 KB
/
palindrome.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# Algorithms to determine if a string is palindrome
fromtimeitimporttimeit
test_data= {
"MALAYALAM": True,
"String": False,
"rotor": True,
"level": True,
"A": True,
"BB": True,
"ABC": False,
"amanaplanacanalpanama": True, # "a man a plan a canal panama"
}
# Ensure our test data is valid
assertall((key==key[::-1]) isvalueforkey, valueintest_data.items())
defis_palindrome(s: str) ->bool:
"""
Return True if s is a palindrome otherwise return False.
>>> all(is_palindrome(key) is value for key, value in test_data.items())
True
"""
start_i=0
end_i=len(s) -1
whilestart_i<end_i:
ifs[start_i] ==s[end_i]:
start_i+=1
end_i-=1
else:
returnFalse
returnTrue
defis_palindrome_traversal(s: str) ->bool:
"""
Return True if s is a palindrome otherwise return False.
>>> all(is_palindrome_traversal(key) is value for key, value in test_data.items())
True
"""
end=len(s) //2
n=len(s)
# We need to traverse till half of the length of string
# as we can get access of the i'th last element from
# i'th index.
# eg: [0,1,2,3,4,5] => 4th index can be accessed
# with the help of 1st index (i==n-i-1)
# where n is length of string
returnall(s[i] ==s[n-i-1] foriinrange(end))
defis_palindrome_recursive(s: str) ->bool:
"""
Return True if s is a palindrome otherwise return False.
>>> all(is_palindrome_recursive(key) is value for key, value in test_data.items())
True
"""
iflen(s) <=2:
returnTrue
ifs[0] ==s[len(s) -1]:
returnis_palindrome_recursive(s[1:-1])
else:
returnFalse
defis_palindrome_slice(s: str) ->bool:
"""
Return True if s is a palindrome otherwise return False.
>>> all(is_palindrome_slice(key) is value for key, value in test_data.items())
True
"""
returns==s[::-1]
defbenchmark_function(name: str) ->None:
stmt=f"all({name}(key) is value for key, value in test_data.items())"
setup=f"from __main__ import test_data, {name}"
number=500000
result=timeit(stmt=stmt, setup=setup, number=number)
print(f"{name:<35} finished {number:,} runs in {result:.5f} seconds")
if__name__=="__main__":
forkey, valueintest_data.items():
assertis_palindrome(key) isis_palindrome_recursive(key)
assertis_palindrome(key) isis_palindrome_slice(key)
print(f"{key:21}{value}")
print("a man a plan a canal panama")
# finished 500,000 runs in 0.46793 seconds
benchmark_function("is_palindrome_slice")
# finished 500,000 runs in 0.85234 seconds
benchmark_function("is_palindrome")
# finished 500,000 runs in 1.32028 seconds
benchmark_function("is_palindrome_recursive")
# finished 500,000 runs in 2.08679 seconds
benchmark_function("is_palindrome_traversal")