ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

力扣刷题百天计划 Day3

2022-01-09 17:02:31  阅读:176  来源: 互联网

标签:end int Day3 力扣 start 地址 maxlength 回文 刷题


学习目标:

我会持续更新我独特的算法思路,希望能给大家带来不一样的思维拓展!
如果大家感觉有帮助的话,欢迎点赞关注支持哦!
你们的鼓励是我坚持下去的动力!
!!!

力扣题库第五题 官方链接


学习内容:

最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:

输入:s = “cbbd”
输出:“bb”
示例 3:

输入:s = “a”
输出:“a”
示例 4:

输入:s = “ac”
输出:“a”

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

来源:力扣(LeetCode)

学习时间:

2022.1.8


学习产出:

思路一
在这里插入图片描述

为什么执行用时会这么长?
因为我们调用了太多的方法,时间复杂度很高,主函数里面为O(n2),判断是否是回文串函数里面为O(n)

解题思路

1.这个和Day2里面的基地址方法差不多,都是定义一个基地址,然后从这个基地址往后面找,找到最长的回文串
2.那么,如何去找?首先确定基地址,然后开启一个for循环,从后往前找,找到一个和基地址相同的字符,那么这个基地址就是start,找到的字符的地址就是end,这个length为end-start+1的字符串疑似是一个回文串
3.我们如何确定它是否是回文串呢?写一个函数判断是否是回文串就行。思路就是将start+i与end-i进行比较,i从0到length/2,如果有一个不匹配,那就不是,直接返回false
4.然后,我们就可以得到以一个基地址开始的最长回文串了。然后后移基地址,继续这个过程
5.这个方法时间复杂度会比较高,算是暴力中带有一丝丝优雅的解题思路,后面我会对其优化
6.但是相比较纯暴力的解题,也就是将每个子串进行判断是否是回文串来说,我这个方法是优雅了许多的。如果真的使用纯暴力,在

public class Solution {
    public string LongestPalindrome(string s) {
        
        if(s.Length==1)return s;

        int start=0;
        int maxlength=0;
        string maxstring="";
        bool isFind;   //在一次遍历中是否找到
        for(int i=0;i<s.Length;i++){
            start=i;
            isFind=false;
            for(int j=s.Length-1;j>i;j--){
                if(s[i]==s[j]){
                    isFind=true;
                    if(IsPalindrome(s,i,j)){ //子串是不是是回文串
                         if(j-i+1>maxlength){
                             maxlength=j-i+1;
                             maxstring=s.Substring(i,maxlength);
                         }
                    }
                }
            }
            
            if(!isFind){  //如果这个基地址 后面都没有与它相同的 那它就是一个长度为1的回文串
                if(1>maxlength){
                    maxlength=1;
                    maxstring=s.Substring(i,1);
                }
            }
        }

        return maxstring;
    }

    
    bool IsPalindrome(string s,int start,int end){
         int length=end-start+1;

        for(int i=0;i<length/2;i++){
            if(s[start+i]!=s[end-i]){ //不对称
                return false;
            }
        }
        return true;
    }
}

思路二
在这里插入图片描述

解题思路
1.经过优化后,执行时间减由900减为150左右,原因在于舍弃了很多不必要的遍历
2.其实就是对思路一里面的步骤2进行了优化,在以选择完基地址,然后从后往前找相同字符的时候,如果这个字符到基地址的长度比我们现在找到的最大长度还短,那就没有必要去判断,因为我们找的是最大长度。

public class Solution {
    public string LongestPalindrome(string s) {
        
        if(s.Length==1)return s;

        int start=0;
        int maxlength=0;
        string maxstring="";
        bool isFind;   //在一次遍历中是否找到
        for(int i=0;i<s.Length;i++){
            start=i;
            isFind=false;
            for(int j=s.Length-1;j>i;j--){
                if(s[i]==s[j]){
                    isFind=true;
                    if(j-i+1>maxlength){
                        if(IsPalindrome(s,i,j)){ //子串是不是是回文串
                            maxlength=j-i+1;
                            maxstring=s.Substring(i,maxlength);
                         }
                    }else{
                        break;
                    }
                }
            }

            if(!isFind){  //如果这个基地址 后面都没有与它相同的 那它就是一个长度为1的回文串
                if(1>maxlength){
                    maxlength=1;
                    maxstring=s.Substring(i,1);
                }
            }
        }

        return maxstring;
    }

    bool IsPalindrome(string s,int start,int end){
         int length=end-start+1;

        for(int i=0;i<length/2;i++){
            if(s[start+i]!=s[end-i]){ //不对称
                return false;
            }
        }
        return true;
    }
}

作者:荷兰猪小灰灰
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:end,int,Day3,力扣,start,地址,maxlength,回文,刷题
来源: https://blog.csdn.net/m0_48781656/article/details/122394687

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有