LeetCode-第四天

又到打卡的一天!!!

感觉时间过的真快,这一天天的一下子就过去了!!!
PS:明天就出高考成绩了,祝我弟考了个好成绩!!!!
废话不多说,开始总结今天写的题…

题目

(1)题目描述:
在这里插入图片描述
这个题目,很熟悉,回文串…但是很少写,还是得尝试尝试加油!!!

(2)解法

  • 开始做法

回文串的一个很重要的点就是找到中间这个点,回文串应该分为两种情况:
1. …AbA’…
2. …Bbbb…B’…
根据这两个情况,主要也是找到b或者n个b这样的情况,所以代码应该分为两个部分,从开头开始,依次寻找,废话不多说,先上代码:

string longestPalindrome(string s) {
        int max_num = 0;
        int max_begin = 0;
        int begin =0;
        int end = 0;
        for(int i=0;i<s.length();i++){
            end = begin = i;
            //不存在中间值或中间值与对称部分相同时
            while((end<s.size()-1) &&s.at(end+1)==s.at(begin)){
                end ++;
            }
            //对称部分
            while((begin>0)&&(end<(s.size()-1))&&(s.at(begin-1)==s.at(end+1))){
                begin --;
                end ++;
            }
            if((end-begin+1)>max_num){
                max_begin = begin;
                max_num = end-begin+1;
            }
        }
        return s.substr(max_begin,max_num);
    }

代码了采用双指针begin和end,指向关于中间值对称的两边,通过寻找两种情况的回文串,存储每一次的最大长,然后判断找出最大长和相应的位置,当然这很明显可以优化!!!下面代码再见!!!

运行结果:
在这里插入图片描述
时间复杂度大概还是平方级别的,所以时耗还是不小啊。

  • 优化后
    1、在n个b的情况时,如果在下一次循环时,依旧从这n个b中开始,显然结果是会比前一次结果更小的,所以很显然,这n个b中,可以直接跳过,可以减少不少时间!!!
    2、当寻找中间值时,有可能剩下的循环,已经不足或者等于现已有最大长度的回文串的一半,很显然,也同样的不须再运行下去!!!
    …还有待寻找,今天有点晚…(以后有时间,我要一个个回来把没有完善的都好好改一遍!!!)
    废话不多说先上代码:
 string longestPalindrome(string s) {
        int max_num = 0;
        int max_begin = 0;
        int begin =0;
        int end = 0;
        for(int i=0;i<s.length();i++){
            if((s.length()-i-1)<=max_num/2&&max_num!=0){
                break;
            }
            end = begin = i;
            //不存在中间值或中间值与对称部分相同时
            while((end<s.size()-1) &&s.at(end+1)==s.at(begin)){
                end ++;
            }
            //跳过n个b的部分
            i = end; 
            //对称部分
            while((begin>0)&&(end<(s.size()-1))&&(s.at(begin-1)==s.at(end+1))){
                begin --;
                end ++;
            }
            if((end-begin+1)>max_num){
                max_begin = begin;
                max_num = end-begin+1;
            }
        }
        return s.substr(max_begin,max_num);
    }

结果:
在这里插入图片描述
后来我发现有可能,第2种优化有可能,不仅没有减少耗时,还有可能增加了!!!
这是 减去代码后的结果,当然不排除是每一次运行不一样的原因!!!:
在这里插入图片描述
这个题做完了,那么BaB这样的串怎么找呢,我想应该也可以通过双指针的方式把他做出来,时间复杂度应该是差不多的!!!

今天就先到这啦!!!

明天就出高考成绩了!!激动的心颤抖的手啊~

睡觉!~!!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值