验证回文串 II
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 40 ms, 内存: 16.1 MB
/*
* 题目思路:
* 1. 使用Java Stream API实现双指针检查回文的逻辑。
* 2. 定义一个辅助函数isPalindrome,用于检查子字符串是否为回文。
* 3. 如果遇到不同字符,分别尝试跳过左指针字符或右指针字符,检查剩下的子字符串是否为回文。
*/
import java.util.stream.IntStream;
public class Solution {
public boolean validPalindrome(String s) {
int left = 0, right = s.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1);
}
left++;
right--;
}
return true;
}
private boolean isPalindrome(String s, int left, int right) {
return IntStream.rangeClosed(left, right)
.allMatch(i -> s.charAt(i) == s.charAt(right - (i - left)));
}
}
解释
方法:
此题解首先检查字符串是否已经是回文;如果是,则直接返回true。如果不是回文,使用双指针技术从字符串的两端开始向中间检查。当遇到不匹配的字符时,考虑两种情况:一是删除左侧字符,二是删除右侧字符。对于每种情况,生成新的子字符串并检查是否为回文。如果其中一种情况导致子字符串成为回文,则原字符串可以通过删除一个字符成为回文。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在判断字符串是否回文时,选择了对整个字符串进行反转和比较,而不是直接使用双指针进行比较?
▷🦆
在处理不匹配的字符时,为什么选择生成两个子字符串进行再次回文验证,而不是直接尝试递归或其他方法?
▷🦆
生成子字符串s_left和s_right时,为何s_left取的是s[left:right]而s_right取的是s[left+1:right+1]?这样的取值范围对应的逻辑基础是什么?
▷