• 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;
            
        }
    }
  • 相关阅读:
    浅谈c/c++中的指针问题
    谈谈八大排序算法问题
    隐藏在default construct后面的是什么
    浅谈编译过程和符号表重定位问题
    1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?
    成长从今天开始
    正则表达式
    安装RPM包或者安装源码包
    文档的压缩与打包
    文本编辑工具
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/4527175.html
Copyright © 2020-2023  润新知