leecode刷题(15)-- 验证回文字符串

leecode刷题(15)-- 验证回文字符串

验证回文字符串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

思路:

刚开始和上一题一样,我也没理解“回文字符串”是什么意思,后来想了下,“回文字符串”其实就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文字符串。

理解了这个,接下来我们来讲解思路:

  1. 去除字符串中的特殊字符,保留字母和数字,因为题目中忽略字母的大小写,所以我们也将字母全部转为小写好了。这里可以使用 replaceAll()toLowerCase() 方法;
  2. 定义和初始化两个游标 left = 0right = s.length() - 1 ,分别指向字符串的开头和结尾;
  3. 我们设置一个while循环,比较 s[left] == s[rigth],如果是回文字符串,那么按从左往右和从右往左的顺序的字母或数字应该是依次相等的;
  4. 如果相等,则让游标 left 和 rigth 加 1 后再次比较对应的字母或数字是否相等;如果不相等,则跳出循环返回 false。
  5. 相等就重复执行 步骤4 的过程,直到跳出循环。

代码如下:

class Solution {
    public boolean isPalindrome(String s) {
        if(s == null) return false;
        s = s.replaceAll("[^a-z^A-Z^0-9]", "").toLowerCase();
		int left = 0, right = s.length() - 1;
		char[] str = s.toCharArray();
		while(left <= right){
            if(str[left] != str[right]){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

因为题目中说将空字符串定义为有效的回文串,所以我们就不需要判断空字符串啦,但是 s == null 并不等于 s.length() == 0 。这里延伸出一个知识点:

Java空字符串与null区别:

1、类型
null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = "" ;

2、内存分配
String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
String str = ""; 表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间;

posted @ 2019-02-23 11:51  希希里之海  阅读(283)  评论(0编辑  收藏  举报