LeetCode【5】

题目

在这里插入图片描述

2.思路

这道题做了很长时间,可能还是自己彩笔吧,昨天因为这道题都没有完成一天一道题的任务。
你要找最长的回文字符串,我没有想的什么好的方法,就是一个一个字符的比较吧。
像“abcba”这种字符串,遍历它从i=0到s.length()-1。对于每个字符,他周围的字符窜还要作比较,先想一下周围的多少个字符做比,当i < (s.length() - 1)/2时这个字符左边的i个数和右边的i个数作比较;否则左右两边s.length() - i - 1个字符做比。那么“abcba”就相当于a要比0次;b要比一次,b左边右边c很明显不用存字符串;c要比两次,很明显abcba是一个回文字符串;后面的b比一次很明显不行。
在这里插入图片描述
上面的有一种情况,像“abccba”这样的字符串刚才那样比的话就没有最长的回文字符串。问题的原因在于当遍历到第一个c是c和后面的c相同了,遇到这种情况右边的应该扩一位作比较。也就是当遍历到第一个c时,发现第i个字符和第i+1个字符相等那么后面的就要扩一位。
在这里插入图片描述

3.注意

我一共试了四次,因为有一些特殊样例。
第一,给的是空的字符串或者只给了一个字符。给一个字符时要初始化为第一个字符。

第二,“aaa”这种情况的处理,当你遍历到第二个a时,因为第二个数字和第三个数字相等,再按之前的比的话就会应越界编译错误。

4.贴图打卡

贴代码

class Solution {
    public String longestPalindrome(String s) {
        String string="";
        String string1="";
        if (s.length()!=0) {
            string1=s.charAt(0)+"";
        }
        StringBuilder sb=new StringBuilder(s+"");
        for (int i = 0; i < s.length() - 1; i++) {
            int divide = 0;
            if (i <=(s.length() - 1) / 2) {
                divide = i;
            } else {
                divide = s.length() - i - 1;//bbbb
            }
            if (s.charAt(i) == s.charAt(i + 1)) {
                string = sb.substring(i, i + 2);
                if (string.length() > string1.length()) {
                    string1 = string;
                }
                for (int i1 = 0; i1 < divide; i1++) {
                    if(i1+1+i+1<s.length()) {
                        if (s.charAt(i - i1 - 1) != s.charAt(i + i1 + 2)) {
                            string = sb.substring(i - i1, i + i1 + 2);
                            if (string.length() > string1.length()) {
                                string1 = string;
                            }
                            break;
                        } else {
                            string = sb.substring(i - i1 - 1, i + i1 + 3);
                            if (string.length() > string1.length()) {
                                string1 = string;
                            }
                        }
                    }
                }
            }
            for (int i1 = 0; i1 < divide; i1++) {
                if (s.charAt(i - 1 - i1) != s.charAt(i + 1 + i1)) {
                    string = sb.substring(i - i1, i + i1 + 1);
                    if (string.length() > string1.length()) {
                        string1 = string;
                    }
                    break;
                } else {
                    string = sb.substring(i - i1 - 1, i + i1 + 2);
                    if (string.length() > string1.length()) {
                        string1 = string;
                    }
                }
            }
        }
        return string1;
    }
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u012385160/article/details/89035607