爨爨爨好

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

▶ 问题:判断一个字符串是否能通过删除至多一个字符来变成回文串。

▶ 算法:

● 使用两个指针,开始时分别指向字符串的首元素和末元素,进行回文检查。若检查到两指针重叠或交换,则说明输入字符串已经是回文,返回正确。

● 若检查到中间某一位置时发现两指针指向的元素不相等,则假设这两个元素之一是多余的元素,做两件事:①去掉此时的首元素,检查剩下的部分是否是回文;②去掉此时的末元素,检查剩下的部分是否是回文。若其中一个返回是,则函数返回正确;若两种情况均返回否,则函数返回错误。

● 代码,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 };

 

posted on 2017-12-27 21:10  爨爨爨好  阅读(135)  评论(0编辑  收藏  举报