验证回文串——双指针
原题在这里:
概述题意:给定一个字符串,在可以删除一个字符的条件下,问是否是回文串。
analyse:
1.刚开始我就想到翻转硬比较:
比较到不等的地方有一个标记,考虑删除 当前位 或者 对称位
code:
class Solution { public: bool validPalindrome(string s) { string x = s; reverse(x.begin(), x.end()); int id = -1, l = s.length(); for (int i = 0; i < l; ++i) if (s[i] != x[i]) { id = i; break; } if (id == -1) return true; string u = s, v = x; s.erase(s.begin() + id), x.erase(x.begin() + l - id - 1); cout << s << '1' << x << endl; v.erase(v.begin() + id), u.erase(u.begin() + l - id - 1); cout << u << '2' << v << endl; return s == x || v == u; } };
效率比较低。
2.双指针,我还是没想到,只想到了可以只分析一半字符串,在这种题情况下,确实应该多往双指针方向思考,也不难。
code:
class Solution { string t; bool flag = false; void dfs(int x, int y, int pd) { if (pd < 0 || flag) return; if (x >= y) { flag = true; return; } if (t[x] == t[y]) dfs(x + 1, y - 1, pd); else dfs(x + 1, y, pd - 1), dfs(x, y - 1, pd - 1); } public: bool validPalindrome(string s) { //双指针思想 t = s; dfs(0, s.length() - 1, 1); return flag; } };
【Over】

浙公网安备 33010602011771号