diff --git a/strings/palindrome.py b/strings/palindrome.py index 4df5639b0c49..f2f49d004e75 100644 --- a/strings/palindrome.py +++ b/strings/palindrome.py @@ -81,6 +81,35 @@ def is_palindrome_slice(s: str) -> bool: return s == s[::-1] +def is_palindrome_ignore_case_and_spaces(s: str) -> bool: + """ + Return True if s is a palindrome, ignoring case, spaces, and punctuation. + Otherwise return False. + + >>> is_palindrome_ignore_case_and_spaces("A man a plan a canal Panama") + True + >>> is_palindrome_ignore_case_and_spaces("Was it a car or a cat I saw?") + True + >>> is_palindrome_ignore_case_and_spaces("Hello World") + False + >>> is_palindrome_ignore_case_and_spaces("Never Odd or Even") + True + >>> is_palindrome_ignore_case_and_spaces("") + True + """ + s = "".join(char.lower() for char in s if char.isalnum()) + return s == s[::-1] + + +test_data_ignore_case_and_spaces = { + "A man a plan a canal Panama": True, + "Was it a car or a cat I saw?": True, + "Hello World": False, + "Never Odd or Even": True, + "": True, +} + + def benchmark_function(name: str) -> None: stmt = f"all({name}(key) == value for key, value in test_data.items())" setup = f"from __main__ import test_data, {name}" @@ -94,13 +123,17 @@ def benchmark_function(name: str) -> None: assert is_palindrome(key) == is_palindrome_recursive(key) assert is_palindrome(key) == is_palindrome_slice(key) print(f"{key:21} {value}") + for key, value in test_data_ignore_case_and_spaces.items(): + assert is_palindrome_ignore_case_and_spaces(key) == value print("a man a plan a canal panama") - # finished 500,000 runs in 0.46793 seconds + # finished 500,000 runs in 1.90863 seconds benchmark_function("is_palindrome_slice") - # finished 500,000 runs in 0.85234 seconds + # finished 500,000 runs in 2.80057 seconds benchmark_function("is_palindrome") - # finished 500,000 runs in 1.32028 seconds + # finished 500,000 runs in 4.50983 seconds benchmark_function("is_palindrome_recursive") - # finished 500,000 runs in 2.08679 seconds + # finished 500,000 runs in 6.81874 seconds benchmark_function("is_palindrome_traversal") + # finished 500,000 runs in 10.64074 seconds + benchmark_function("is_palindrome_ignore_case_and_spaces")