『力扣每日一题08』验证回文串

一、题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

二、思路解析

不幸的是,这道题我又没做出来,不过我又学到一种解题方法!

定义的 i 和 j 这两个变量,就是类似两个指针的作用,一个用于从前向后遍历,另一个则是从后向前遍历。

中间碰到非数字和字母的元素就跳过,要是 i 不等于 j 了,就说明该字符串不是回文串了。

需要注意的就是,i 要一直走到一个合法的字符那里  有可能i要走很多步。

j 也是同理,因此要有条件判断,能让 i++ 和 j-- 。而这个条件就是我前面说的 “判断是否为数字和字母” 。

最后再对元素进行判断即可,看看 i 和 j 是否相等,返回 true 或者 false 即可~

三、完整代码

class Solution {
    public  boolean isNumOrCharacter(char ch) {
        if(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z') {
            return true;
        }
        return false;
    }

    public  boolean isPalindrome(String s) {
        s = s.toLowerCase();
        
        int i = 0;
        int j = s.length()-1;

        
        while (i < j) {
            
            while (i < j && !isNumOrCharacter(s.charAt(i))) {
                i++;
            }
            
            while (i < j &&!isNumOrCharacter(s.charAt(j))) {
                j--;
            }
            
            if(s.charAt(i) == s.charAt(j)) {
                i++;
                j--;
            }

            else {
                
                return false;
            }
        }
        return true;
    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

你可能感兴趣的:(力扣每日一题,leetcode,算法,职场和发展,java,力扣,eclipse,intellij-idea)