题目描述
给定一个非空字符串s
,最多删除一个字符。判断是否能成为回文字符串。
示例1:
输入: “aba"
输出: True
示例2:
输入: “abca"
输出: True
解释: 你可以删除c字符。
注意: 字符串只包含a-z
的小写字母。字符串的最大长度是50000
。
思路分析
题目难度为简单 ,这里的难点在判断删除字符后的判断,这里我们可以直接参考LeetCode125来参考简单回文字符串的判定;这里我们需要当检测到不等的字符串对时判断将左边界收缩后字符串判断和右边界收缩后字符串判断相结合。
解题步骤:
- 双指针遍历字符串,判断是否存在不等字符,不存在返回
true
;否则进入步骤2; - 判断
[i, j-1]
或[i+1, j]
范围的字符串是否为回文字符串,这里判定一次即可,因为题干说明最多删除一个字符。
解题代码
public static boolean solution(String s) {
for(int i = 0, j = s.length() - 1; i < j; i++, j--){
if(s.charAt(i) != s.charAt(j))
return isPali(s, i+1, j) || isPali(s, i, j-1);
}
return true;
}
private static boolean isPali(String s, int start, int end){
while(start < end)
if(s.charAt(start++) != s.charAt(end++))
return false;
return true;
}
复杂度分析
时间复杂度: 我们对字符串仅遍历了一次,故时间复杂度为O(n)
;
空间复杂度: 没有借助辅助容器,故空间复杂度为O(1)
;
Github源码
完整可运行文件请访问GitHub。