leetcode 680 验证回文字符串II (贪心)
题目描述:
给定一个非空字符串 s
,最多删除一个字符。判断是否能成为回文字符串。
题解:
在允许最多删除一个字符的情况下,同样可以使用双指针,通过贪心算法实现。初始化两个指针$low$ 和 $high$ 分别指向字符串的第一个字符和最后一个字符。每次判断两个指针指向的字符是否相同,如果相同,则更新指针,令 $low = low + 1$ 和 $high = high - 1$,然后判断更新后的指针范围内的子串是否是回文字符串。如果两个指针指向的字符不同,则两个字符中必须有一个被删除,此时我们就分成两种情况:即删除左指针对应的字符,留下子串 $s[low + 1], s[low + 1], ..., s[high]$,或者删除右指针对应的字符,留下子串 $s[low], s[low + 1], ..., s[high - 1]$。当这两个子串中至少有一个是回文串时,就说明原始字符串删除一个字符之后就以成为回文串。代码如下:
class Solution { public: bool isPa(string s,int l,int r) { while(l < r) { if(s[l] != s[r]) return false; l++; r--; } return true; } bool validPalindrome(string s) { int len = s.size(); int l = 0; int r = len-1; while(l < r) { if(s[l] == s[r]) { l++; r--; } else return isPa(s,l+1,r) || isPa(s,l,r-1); } return true; } };