LeetCode150道面试经典题--验证回文串(简单)

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

 

1.题目

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

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

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

2.示例

image.gif编辑


3.思路

双指针:

先将字符串通过String的LowerCase方法让字符串所有字符变为小写字符,再通过设置头尾两个指针放置于字符串的头尾,在遍历字符串时候,头尾指针先进行遍历找到合法字符(通过方法Character.isLetterOrDigit方法就能识别该字符是否合法)进行比较。举例来说比如一个字符串

“a ) s a (” 那么头尾指针第一个找到的就是a进行比较,如果相等则头尾指针往中心靠拢一格,直到指针相等或者头指针小于尾部指针

4.代码

LeetCode代码:

class Solution {
    public boolean isPalindrome(String s) {
      String str = s.toLowerCase();
        int pre = 0;
        int Des = str.length() - 1;
        while (pre < Des) {
            while (pre < Des && !Character.isLetterOrDigit(str.charAt(pre))) {
                pre++;
            }
            while (pre < Des && !Character.isLetterOrDigit(str.charAt(Des))) {
                Des--;
            }
            if (str.charAt(pre) != str.charAt(Des)) {
                return false;
            }
            pre++;
            Des--;
        }
        return true;
    }
}

image.gif

image.gif编辑

总结:时间复杂度为O(n) 空间复杂度为 O(1)

详细案例代码:

package LeetCode1001;
public class javaDemo {
    public static void main(String[] args) {
        String s = "A man, a plan, a canal: Panama";
//        返回值
        boolean flag = true;
//        将字符串转为小数
       String str = s.toLowerCase();
//        设置头尾指针
        int pre=0; int des=str.length()-1;
        while (pre<=des){
//            在找到相应的合法字符前一直靠拢
            while (pre<des && !Character.isLetterOrDigit(str.charAt(pre))){
                pre++;
            }
            while (des>pre && !Character.isLetterOrDigit(des)){
                des--;
            }
//            当两个指针都各就位时候则开始比较,如果字符不匹配则直接返回flase
            if (str.charAt(pre)!=str.charAt(des)){
                flag = false;
                break;
            }
//            如果两个有效位都一样则继续往中间靠拢
            pre++;des--;
        }
//        输出返回值
        System.out.println(flag);
    }
}

image.gif


目录
相关文章
|
2天前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
29 0
|
2天前
|
Java
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
11 1
|
2天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
2天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
2天前
leetcode代码记录(对称二叉树 中序遍历+回文串 为什么不行
leetcode代码记录(对称二叉树 中序遍历+回文串 为什么不行
8 0
|
2天前
|
C++ 索引
【力扣经典面试题】14. 最长公共前缀
【力扣经典面试题】14. 最长公共前缀
|
2天前
|
C++
【力扣经典面试题】58. 最后一个单词的长度
【力扣经典面试题】58. 最后一个单词的长度
|
2天前
|
算法 Java
【力扣经典面试题】12. 整数转罗马数字
【力扣经典面试题】12. 整数转罗马数字
|
2天前
|
索引
[经典力扣面试题]135. 分发糖果
[经典力扣面试题]135. 分发糖果
|
2天前
|
算法 C++ 索引
【力扣经典面试题】238. 除自身以外数组的乘积
【力扣经典面试题】238. 除自身以外数组的乘积