判断字符串是不是回文

题目描述

判断题目给出的字符串是不是回文,仅考虑字符串中的字母字符和数字字符,并且忽略大小写

例如:"A man, a plan, a canal: Panama"是回文

"race a car"不是回文

注意:

你有没有考虑过字符串可能为空?这是面试时应该提出的一个好问题。

针对这个问题,我们定义空字符串是回文

分析

这让我想起昨天做的类似的题目,“给一串字符串找出最小的分割次数使分割后的每一个串都是回文的”,用的是动态规划的思想,核心思想是:设字符串长度为 l,对于当前串 i…l-1(0<=i 这道题不需要分割,操作看上去比动态规划要更加清晰和思路明确:把是字母或者数字的字符拆出来重新组合成一个串,然后设计两个指针一个指向前面一个指向后面,两者同时往中间靠,当发现指针所指不满足相等条件,就说明不是回文。
记一下常见字符的ascii:
数字:48 - 57
大写字母: 65 - 90
小写字母: 97 - 122
一些需要对字符进行hash的题目需要用到这些数值。

时间复杂度
O(n)

代码

public class Solution {
    public boolean isPalindrome(String s) {
        int l = s.length();
        if(l==0)return true;
        StringBuffer buf = new StringBuffer();
        for(int i=0;i<l;i++)
            if((s.charAt(i)>=48&&s.charAt(i)<=57 ) || 
               (s.charAt(i)>=65&&s.charAt(i)<=90 ) ||
               (s.charAt(i)>=97&&s.charAt(i)<=122 ) )
                    buf.append(s.charAt(i));
        int n = buf.length();
        if(n<2)return true;
        int i=0,j=n-1;
        while(i<j){
            //不相等,且不是大小写字母
            if(buf.charAt(i)!=buf.charAt(j) && Math.abs(buf.charAt(i)-buf.charAt(j))!=32)return false;
            else{
                i++;
                j--;
            }
        }
        return true;
    }
}

你可能感兴趣的:(leetcode,字符串)