最长回文子串 LeetCode

这道题目 我思考了很久也查了一下网上的一些思路,很多人是在说这是一道动态规划的题目,思路呢就是 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库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值