这道题目 我思考了很久也查了一下网上的一些思路,很多人是在说这是一道动态规划的题目,思路呢就是 i 到 j 之间是不是回文数字,要看 i + 1 到 j -1 是不是回文字符串。这样的思路固然可是,但是这个就像堆积木,你要从1 和 2 一点点堆到 3 到4 以至于跟高来求得答案。(我就不写源码了,比较懒)
还看到了一个Manacher法的blog,这个说的是在每个字符前后加#号,然后又用了临时数组什么的,
其实我觉得它的本质很简单,我们要看本质,理解它 为什么这么做, 目的就是吧两种情况和为一种情况来讨论,举个例子
abba 和 abcba
你要是想某一个点开始像两边展开判断,就必须分这两种情况判断
abba 中心是bb abcba中心是c 一个是2个字符一个是一个
他这么做了之后就没必要分情况讨论
a # b # b # a
a # b # c # b # a
都可以从一个字符来看,然后把 # 的个数去掉就完事了
然后我最开始的思路和它差不多,但是我没有做这样的处理,而是直接分情况来讨论
string longestPalindrome(string s) {
if (s.empty()) return "";
int max = 1, st = 0, en = 0;
for(int i = 0; i < s.size() - 1; ++i){
/*
** 这里就是第一种情况
*/
int begin = i, end = i, len = 1;
while(begin - 1 >= 0 && end - 1 < s.size() && s[begin-1] == s[end+1]){
len = len + 2; begin--; end++;
}
if (len > max) { max = len; st = begin; en = end; }
/*
** 这里就是第二种情况
*/
begin = i; end = i + 1;
if (s[begin] == s[end]){
len = 2;
while(begin - 1 >=0 && end + 1 < s.size() && s[begin-1] == s[end + 1]){
len = len + 2; begin--; end++;
}
if (len > max) { max = len; st = begin; en = end; }
}
}
return s.substr(st, max);
}
效率也没问题
那么往后思考一下这道题目,在一个字符串中求回文串,还要是最长,
那么我可以这么想: 我有的信息就是 字母 和 他们的位置
那么 我其实还有一个思路
a.用hash来保存字符所有出现的位置
b.对每一个对出现的位置来求中点
c.统计中点出现最多的那个点
d.这个点就是回文串的中心
可惜我没写。。。。。。。 没有验证
我还有一个失败脑洞
把他们当作26进制的数,把他们像尺子一样像两边进行移位运算。
不知道会不会有人看到这篇文章,也许没有吧,那我立个flag
===
一个月内出一篇红黑树的讲解的blog,要求简单好理解,详细且我要手写源码,尽可能不用函数库特别是STL库