验证回文串 IV
难度:
标签:
题目描述
代码结果
运行时间: 35 ms, 内存: 16.1 MB
/*
* 题目思路:
* 给定一个字符串s,我们需要判断它是否是一个回文串。在这个问题中,我们需要考虑以下情况:
* 1. 忽略大小写
* 2. 忽略非字母和数字的字符
* 3. 如果删除一个字符后可以成为回文串,那么返回true
*
* 我们可以分步进行:
* 1. 预处理字符串,去除非字母和数字的字符,并将所有字符转换为小写
* 2. 使用双指针法检查是否是回文串
* 3. 如果不是回文串,尝试删除一个字符后再进行检查
*/
import java.util.stream.IntStream;
public class Solution {
public boolean validPalindrome(String s) {
// 预处理字符串
String cleanedStr = s.chars()
.filter(Character::isLetterOrDigit)
.mapToObj(c -> String.valueOf((char) c).toLowerCase())
.collect(Collectors.joining());
// 检查是否为回文
if (isPalindrome(cleanedStr)) {
return true;
}
// 尝试删除一个字符后再检查
return IntStream.range(0, cleanedStr.length())
.anyMatch(i -> isPalindrome(cleanedStr.substring(0, i) + cleanedStr.substring(i + 1)));
}
private boolean isPalindrome(String s) {
return IntStream.range(0, s.length() / 2)
.allMatch(i -> s.charAt(i) == s.charAt(s.length() - 1 - i));
}
}
解释
方法:
此题的目标是判断给定字符串是否可以通过至多两次修改变成回文串。解题思路是通过一次遍历的方式,从字符串的两头向中心检查字符是否相等。如果发现不相等的字符,允许减少一次修改机会(即times变量减1)。如果在遍历过程中,需要的修改次数超过2次(times变成负数),则直接返回False。如果整个遍历完成后,修改次数没有超过2次,返回True。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在算法中,为什么选择从字符串两端向中心遍历而不是从中心向两端遍历?
▷🦆
如果在某次比较中字符不相等,为什么直接减少修改次数而不是尝试其他操作,比如替换字符?
▷🦆
在算法中,times变量初始化为2意味着什么?是否表示可以进行两次删除操作,两次添加操作,还是两次替换操作?
▷🦆
算法如何处理长度为奇数的字符串,中间的字符是否需要检查?
▷