怒刷力扣(验证回文串)

简介: 双指针算法,不是第一次用了,这个题使用双指针算法能提高近一半的效率,看见字符串就习惯性的对字符串进行处理。

验证回文串

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

[题目]())

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

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

初次分析

首先对字符串里非大小写字母数字进行删除。将删除完的字符串进行前后对比,对比相同即认为是有效的回文串,对比不同的则认为不是回文串。

  • 1、对字符串里非大小写字母数字进行删除

    起初我将空格、逗号替换成空字符串,但是测试的时候发现,非大小写字母数字的字符很多种,才发觉这种方式不可行。

    后来则是写了个正则[^A-Za-z0-9],不是数字大小写字母的进行替换。

  • 2、前后对比。我们只需要遍历一半字符串长度,每次遍历前后对比即可。
public static  boolean isPalindrome(String s) {
    s=s.toLowerCase().replaceAll("[^A-Za-z0-9]","").trim();
    if(s.isEmpty()){
        return true;
    }
    for (int i = 0; i < s.length()/2; i++) {
        if(s.charAt(i)!=s.charAt(s.length()-1-i)){
            return false;
        }
    }
    return true;
}

继续分析

看了看答案,官方答案没有这种解法,但是别人写的基本上都是我这种解法。答案的最后一种解法是双指针,我们题目中将非大小写字母数字进行替换的时候会遍历一遍字符串。如果使用双指针的话,则减少了这一次的遍历,也就是说增加一个头指针和一个尾指针代替我们的从头到尾遍历。当指针指向的字符不是大小写字母数字时,直接移动指针。如果符合的话,则进行对比后移动指针。

答案

public boolean isPalindrome(String s) {
        int length = s.length();
        int left = 0, right = length - 1;
        while (left < right) {
            while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
                ++left;
            }
            while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
                --right;
            }
            if (left < right) {
                if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                    return false;
                }
                ++left;
                --right;
            }
        }
        return true;
    }

复杂度

  • 时间复杂度: O(n),其中n是字符串的长度,也就是需要遍历一遍这个字符串。
  • 空间复杂度: O(1),需要首尾两个指针记录遍历的位置。

总结

这里用到了两个方法

  • isLetterOrDigit:判断字符是不是字母或数字
  • toLowerCase:大写转小写

这里的双指针和我的解法本质是一样的,但是时间复杂度上稍微要好些,因为我的解法需要遍历一遍进行替换字符串,然后再遍历一半进行对比。所以这个题还是推荐双指针。其实这个题型前边已经做过很多次了。

都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!

目录
相关文章
|
6月前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
55 0
|
1月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
11 0
|
3月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
30 6
|
3月前
|
Python
【Leetcode刷题Python】131. 分割回文串
LeetCode题目131的Python编程解决方案,题目要求将给定字符串分割成所有可能的子串,且每个子串都是回文串,并返回所有可能的分割方案。
21 2
|
5月前
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
5月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
5月前
力扣经典150题第二十五题:验证回文串
力扣经典150题第二十五题:验证回文串
35 0
|
5月前
|
canal 算法 数据可视化
LeetCode 125题:验证回文串
LeetCode 125题:验证回文串
|
5月前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
5月前
|
存储 算法 Java
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
33 0