diff --git a/DIRECTORY.md b/DIRECTORY.md index f8f08ff..1dea295 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -36,6 +36,7 @@ * [Sort Squares Of An Array](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/arrays/sort_squares_of_an_array.rb) * [Sorted Arrays Intersection](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/arrays/sorted_arrays_intersection.rb) * Strings + * [Almost Palindrome Checker](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/arrays/strings/almost_palindrome_checker.rb) * [Anagram Checker](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/arrays/strings/anagram_checker.rb) * [Jewels And Stones](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/arrays/strings/jewels_and_stones.rb) * [Palindrome](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/arrays/strings/palindrome.rb) diff --git a/data_structures/arrays/strings/almost_palindrome_checker.rb b/data_structures/arrays/strings/almost_palindrome_checker.rb new file mode 100644 index 0000000..0115ec3 --- /dev/null +++ b/data_structures/arrays/strings/almost_palindrome_checker.rb @@ -0,0 +1,67 @@ +# Challenge name: Almost Palindrome +# +# Given a string s, return true if the s can be palindrome after deleting at most one character from it. +# +# Example 1: +# Input: s = "aba" +# Output: true +# +# Example 2: +# Input: s = "abca" +# Output: true +# Explanation: You could delete the character 'c'. +# +# Example 3: +# Input: s = "abc" +# Output: false +# +# Constraints: +# 1 <= s.length <= 105 +# s consists of lowercase English letters. + +# +# Approach 1: Two Pointers +# + +# Complexity Analysis: +# +# Time Complexity: O(n) +# Space Complexity: O(1) + + +def almost_palindrome_checker(string) + p1 = 0 + p2 = string.length - 1 + array = string.split('') + + while p1 < p2 + if array[p1] != array[p2] + return palindrome_checker(array, p1, p2 - 1) || palindrome_checker(array, p1 + 1, p2) + end + p1 += 1 + p2 -= 1 + end + + true +end + +def palindrome_checker(array, p1, p2) + while p1 < p2 + if array[p1] != array[p2] + return false + end + p1 += 1 + p2 -= 1 + end + + true +end + +puts almost_palindrome_checker('aba') +# => true + +puts almost_palindrome_checker('abca') +# => true + +puts almost_palindrome_checker('abc') +# => false