▶ 问题:判断一个字符串是否能通过删除至多一个字符来变成回文串。
▶ 算法:
● 使用两个指针,开始时分别指向字符串的首元素和末元素,进行回文检查。若检查到两指针重叠或交换,则说明输入字符串已经是回文,返回正确。
● 若检查到中间某一位置时发现两指针指向的元素不相等,则假设这两个元素之一是多余的元素,做两件事:①去掉此时的首元素,检查剩下的部分是否是回文;②去掉此时的末元素,检查剩下的部分是否是回文。若其中一个返回是,则函数返回正确;若两种情况均返回否,则函数返回错误。
● 代码,139 ms,最快的解法算法与之相同
1 class Solution 2 { 3 public: 4 bool isPalindromeRange(string s, int i, int j) 5 { 6 for (int k = i; k <= i + (j - i) / 2; k++) 7 { 8 if (s[k] != s[j - k + i]) 9 return false; 10 } 11 return true; 12 } 13 bool validPalindrome(string s) 14 { 15 for (int i = 0; i < s.length() / 2; i++) 16 { 17 if (s[i] != s[s.size() - 1 - i]) 18 { 19 int j = s.size() - 1 - i; 20 return isPalindromeRange(s, i + 1, j) || isPalindromeRange(s, i, j - 1); 21 } 22 } 23 return true; 24 } 25 };