• 【LeetCode】125. Valid Palindrome


    Difficulty:easy

     More:【目录】LeetCode Java实现

    Description

    https://leetcode.com/problems/valid-palindrome/

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

    Note: For the purpose of this problem, we define empty string as valid palindrome.

    Example 1:

    Input: "A man, a plan, a canal: Panama"
    Output: true
    

    Example 2:

    Input: "race a car"
    Output: false

    Intuition

    Use two pointers, one points to head (walk toward tail), another points to tail(walk toward head), if two characters are different, then return false.

    Be careful: There are no different between a lower case letter and its upper case in this problem.

    Solution

    With the help of API:

        public boolean isPalindrome(String s) {
            if(s==null || s.length()<0)
                return false;
            int head=0;
            int tail=s.length()-1;
            while(head<=tail){
                if(!Character.isLetterOrDigit(s.charAt(head)))
                    head++;
                else if(!Character.isLetterOrDigit(s.charAt(tail)))
                    tail--;
                else{
                    if(Character.toLowerCase(s.charAt(head))!=Character.toLowerCase(s.charAt(tail)))
                        return false;
                    head++;
                    tail--;
                }
            }
            return true;
        }
    

      

    Without API:

        public boolean isPalindrome(String s) {
            if(s==null)
                return false;       
            int i=0;
            int j=s.length()-1;
            
            while(i<=j){
                while(i<s.length() && (!(isAlpha(s.charAt(i)) || isNumeric(s.charAt(i)))))
                    i++;
                while(j>=0 && (!(isAlpha(s.charAt(j)) || isNumeric(s.charAt(j)))))
                    j--;
                if(i<s.length() && j>=0 && !isSame(s.charAt(i),s.charAt(j)) )
                    return false;
                i++;
                j--;
            }
            return true;
        }
        
        private boolean isAlpha(char c){
            if( (c>='a' && c<='z') || (c>='A' && c<='Z'))
                return true;
            return false;
        }
    
        private boolean isNumeric(char c){
            if(c>='0' && c<='9')
                return true;
            return false;
        }
    
        private boolean isSame(char a,char b){
            if(a==b)
                return true;
            int len='A'-'a';
            if((isAlpha(a)&&isAlpha(b)) && (a-b==len || b-a==len))
                return true;
            return false;
        }
        
    

      

    Complexity

    Time complexity : O(n)

    Space complexity :  O(1)

     

    What I've learned

    1. API: Character.isLetterOrDigit(c), Character.toLowerCase(c), Character.toUpperCase(c)

    2. DO NOT forget head++ and tail-- in the line 14 and line 15

    3. DO NOT forget  i<s.length() && j>=0 in the lines 8,10,12

    4. s.length() not s.length

     More:【目录】LeetCode Java实现

  • 相关阅读:
    ReactJS入门学习一
    js控制html5 【video】标签中视频的播放和停止
    CentOS中vsftp安装与配置
    linux 添加多个网段
    js图片预加载后触发操作
    nodejs在后台运行
    asp.net环境搭建
    aspx aspx.cs
    linux 添加静态ip dns
    kali ssh服务开启登录
  • 原文地址:https://www.cnblogs.com/yongh/p/10011405.html
Copyright © 2020-2023  润新知