• LeetCode--Valid Palindrome


    相似题目:

    Palindrome Number

    Valid PalinDrome

    Reverse Linked List

      Palindrome Linked List

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

    For example,
    "A man, a plan, a canal: Panama" is a palindrome.
    "race a car" is not a palindrome.

    Note:
    Have you consider that the string might be empty? This is a good question to ask during an interview.

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

    问题描述:给出一个字符串,判断是否为回文,只考虑数字和字符,并且忽略大小写。注意:你考虑到空字符串了吗?这是一个你面试时可以向考官提问的好问题。在这里,我们认为空字符串也是回文。

    问题解决:首先将原来字符串预处理,将无关的标点符号去除,并且全部大写转化为小写;得出字符串的总长度,分偶数跟奇数两种情况处理。分别用第一个vs最后一个,第二个vs倒数第二个,……这样一次比较,判断是否为回文。

    代码如下:

    public class Solution {
        public boolean isPalindrome(String s) {
            if(s==null)
                return true;
            if(s.length()==0)
                return true;
            s = s.toLowerCase();
            char[] ch = s.toCharArray();
            ArrayList<Character> l = new ArrayList<Character>();
            for(int i=0; i<ch.length; i++){
                if(ch[i]>='a' && ch[i]<='z' || ch[i]>='0'&&ch[i]<='9'){
                    l.add(ch[i]);
                }
            }
            
            if(l.size()==0)
                return true;
            
            int r = l.size()%2;
            int t = l.size()/2;
            
            if(r==0){ //是偶数
                if(!l.get(t-1).equals(l.get(t)))
                    return false;
                else{
                    for(int i=0; i<t-1; i++){
                        if(!l.get(i).equals(l.get(l.size()-i-1)))
                            return false;
                    }
                    return true;
                }
            }
            
            else{ //是奇数
                for(int i=0; i<t; i++){
                    if(!l.get(i).equals(l.get(l.size()-i-1)))
                        return false;
                }
                return true;
            }
        }
    }

     解法二:可以看到,在上面的解法中使用了数组,ArrayList等额外空间,时间复杂度为O(n),空间复杂度为O(n)。一种改进的方法是直接在原来字符串上操作,一个首指针,一个尾指针,如果当前所指是字母或者数字,则比较并移动,如果最后可以重合,则该字符串是回文。

    public class Solution {
        
        public boolean isValid(char c){
            if(c<='z'&&c>='a' || c>='0'&&c<='9')
                return true;
            else
                return false;
        }   
        
        public boolean isPalindrome(String s) {
            if(s==null)
                return true;
            if(s.length()==0)
                return true;
            s = s.toLowerCase();
            char[] ch = s.toCharArray();
            
            int i = 0, j = ch.length-1;
            
            while(i!=j&&i<=ch.length-1&&j>=0){
                if(isValid(ch[i])&&isValid(ch[j])){
                    if(ch[i]!=ch[j])
                        return false;
                    i++;
                    j--;
                }
                else if(!isValid(ch[i]))
                    i++;
                else if(!isValid(ch[j]))
                    j--;
                else{
                    i++;
                    j--;
                }
                    
            }
            return true;
            
        }
    }
  • 相关阅读:
    Spring boot 2.0整合mybatis和druid数据源,基于starter方式
    MySQL 5.7 等高版本关于JDBC驱动的几个问题
    使用maven,包括配置阿里云镜像和eclipse的配置
    vue的学习
    Awesome Vue.js vue.js学习资源链接大全 中文
    vscode
    lombok插件安装
    Spring Boot 面试题
    Get started with Docker for Windows
    详解WebMvcConfigurer接口
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/4527175.html
Copyright © 2020-2023  润新知