LeetCode LCR 018. 验证回文串

题目描述

LCR 018. 验证回文串

思路分析

解法一:双指针过滤(推荐)

核心思路

  • 使用左右指针从两端向中间收缩,跳过非字母数字字符。
  • 对比时统一转成小写,若不相等直接返回 false。
  • 指针相遇或交错则说明是回文。

复杂度分析

  • 时间复杂度:O(n),其中 n 表示字符串长度。
  • 空间复杂度:O(1),其中仅使用常数额外空间。
class Solution {
    public boolean isPalindrome(String s) {
        int left = 0;
        int right = s.length() - 1;

        while (left < right) {
            // 跳过左侧非字母数字字符
            while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
                left++;
            }

            // 跳过右侧非字母数字字符
            while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
                right--;
            }

            // 忽略大小写比较两端字符
            char c1 = Character.toLowerCase(s.charAt(left));
            char c2 = Character.toLowerCase(s.charAt(right));
            if (c1 != c2) {
                return false;
            }

            left++;
            right--;
        }

        return true;
    }
}
func isPalindrome(s string) bool {
	left := 0
	right := len(s) - 1

	for left < right {
		// 跳过左侧非字母数字字符
		for left < right && !isAlphaNum(s[left]) {
			left++
		}

		// 跳过右侧非字母数字字符
		for left < right && !isAlphaNum(s[right]) {
			right--
		}

		// 忽略大小写比较两端字符
		c1 := toLower(s[left])
		c2 := toLower(s[right])
		if c1 != c2 {
			return false
		}

		left++
		right--
	}

	return true
}

func isAlphaNum(c byte) bool {
	return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')
}

func toLower(c byte) byte {
	if c >= 'A' && c <= 'Z' {
		return c - 'A' + 'a'
	}

	return c
}

相似题目

题目 难度 考察点
9. 回文数 简单 双指针/数值处理
234. 回文链表 简单 快慢指针
680. 验证回文串 II 简单 双指针
409. 最长回文串 简单 计数贪心
647. 回文子串 中等 中心扩展
5. 最长回文子串 中等 中心扩展/DP
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/58023379
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!