【双指针】Leetcode --- NO.680 验证回文字符串 Ⅱ(Java)

题目描述

在这里插入图片描述

题目分析

  • 给定一个非空字符串,所以不用判空
  • 如果单单是验证回文字符串,那就是非常简单了,难点就在于要判断最多删除一个字符后是否能成为回文字符串

解法分析

  • 根据题意,如果字符串为abca,那么在删除c后,仍然能构成回文字符串,则返回TRUE
  • 那么对应的就是当头指针和尾指针指向的字符不等时,当去掉其中一个字符后,继续判断剩下的是否仍构成回文字符串,且最多去掉一个字符
  • 那么前面已经判断过的,删掉一个字符后仍然是对称的,就不需要再回去判断了
  • 所以只需要删除头指针或尾指针的一个字符后,继续判断是否为回文字符串即可
    在这里插入图片描述

代码

class Solution {
    public boolean validPalindrome(String s) {
    	// 转换成字符数组,方便操作
        char[] arr = s.toCharArray();
        // 数组长度
        int len = arr.length;
        // 循环遍历
        for (int i = 0, j = len - 1; i < j; i++, j--) {
        	// 当头指针和尾指针指向的字符不相等时,若相等就继续下次循环
            if (arr[i] != arr[j]) {
            	// 只需要判断剩下的字符是否构成回文字符串即可
            	// 要么去掉头指针指向的字符,要么去掉尾指针指向的字符
                return isValidPalindrome(arr, i + 1, j) || isValidPalindrome(arr, i, j - 1);
            }
        }
        return true;
    }
    // 判断 i 到 j 这个区间内的字符是否构成回文字符串
    public boolean isValidPalindrome(char[] arr, int i, int j) {
        for (int k = i; k <= j; k++, j--) {
        	// 如果遇到不一样的,因为已经去掉了一个字符了,所以直接返回 false 即可
            if (arr[k] != arr[j]) {
                return false;
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/Kobe_k/article/details/107495348
今日推荐