DEV Community

Arpit Rathore
Arpit Rathore

Posted on

125. Valid Palindrome

Important links

Intuition

  • Start with two points left and right.
  • Keep moving towards center while checking if characters at left and right match
  • If do not match, break (return false)
  • If all characters match, return true at the end

Corner cases

  • Check for lower/upper case (Convert whole string to lower)
  • Check if a character is a letter of not

Solution

class Solution {

    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int left = 0, right = s.length() - 1;

        while (left < right) {
            tps(s, left, right);
            if (!Character.isLetter(s.charAt(left))) {
                left++;
                continue;
            }

            if (!Character.isLetter(s.charAt(right))) {
                right--;
                continue;
            }

            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }

        return true;
    }

    private void tps(String s, int l, int r, String... prefix) {
        if (prefix.length == 0) {
            prefix = new String[] { "" };
        }
        System.out.print(prefix[0]);
        for (int i = 0; i < s.length(); i++) {
            if (i == l && i == r) {
                System.out.printf("[(%s)]", s.charAt(i));
            } else if (i == l) {
                System.out.printf("(%s)", s.charAt(i));
            } else if (i == r) {
                System.out.printf("[%s]", s.charAt(i));
            } else {
                System.out.print(s.charAt(i));
            }
            System.out.printf(" ");
        }
        System.out.printf("| l=%s, r=%s %n", l, r);
    }
}
Enter fullscreen mode Exit fullscreen mode

Visualisation

I always use helper methods to print the two pointers and values at those points. This helps me visualize how the pointers are moving and debug if required.

Input: s="A man, a plan, a canal: Panama"

Std out:
(a)   m a n ,   a   p l a n ,   a   c a n a l :   p a n a m [a] | l=0, r=29 
a ( ) m a n ,   a   p l a n ,   a   c a n a l :   p a n a [m] a | l=1, r=28 
a   (m) a n ,   a   p l a n ,   a   c a n a l :   p a n a [m] a | l=2, r=28 
a   m (a) n ,   a   p l a n ,   a   c a n a l :   p a n [a] m a | l=3, r=27 
a   m a (n) ,   a   p l a n ,   a   c a n a l :   p a [n] a m a | l=4, r=26 
a   m a n (,)   a   p l a n ,   a   c a n a l :   p [a] n a m a | l=5, r=25 
a   m a n , ( ) a   p l a n ,   a   c a n a l :   p [a] n a m a | l=6, r=25 
a   m a n ,   (a)   p l a n ,   a   c a n a l :   p [a] n a m a | l=7, r=25 
a   m a n ,   a ( ) p l a n ,   a   c a n a l :   [p] a n a m a | l=8, r=24 
a   m a n ,   a   (p) l a n ,   a   c a n a l :   [p] a n a m a | l=9, r=24 
a   m a n ,   a   p (l) a n ,   a   c a n a l : [ ] p a n a m a | l=10, r=23 
a   m a n ,   a   p (l) a n ,   a   c a n a l [:]   p a n a m a | l=10, r=22 
a   m a n ,   a   p (l) a n ,   a   c a n a [l] :   p a n a m a | l=10, r=21 
a   m a n ,   a   p l (a) n ,   a   c a n [a] l :   p a n a m a | l=11, r=20 
a   m a n ,   a   p l a (n) ,   a   c a [n] a l :   p a n a m a | l=12, r=19 
a   m a n ,   a   p l a n (,)   a   c [a] n a l :   p a n a m a | l=13, r=18 
a   m a n ,   a   p l a n , ( ) a   c [a] n a l :   p a n a m a | l=14, r=18 
a   m a n ,   a   p l a n ,   (a)   c [a] n a l :   p a n a m a | l=15, r=18 
a   m a n ,   a   p l a n ,   a ( ) [c] a n a l :   p a n a m a | l=16, r=17
Enter fullscreen mode Exit fullscreen mode

Top comments (0)