非独立思考

    1. class Solution {
    2. public String longestPalindrome(String s) {
    3. // 中心扩散:遍历每个下标,以下标为中心,利用“回文”的特点向2边扩散,看看能扩散多远
    4. // 奇偶次的中心点不同:前者一个下标表示,后者需要两个
    5. // 所以设计中心扩散函数时,可以分为:传入重合下标与传入相邻下标
    6. int len = s.length();
    7. if (len < 2) {
    8. return s;
    9. }
    10. int resLen = 0;
    11. int[] res = new int[2];
    12. for (int i = 0; i < len; i++) {
    13. int[] odd = centerDiffusion(s, i, i);
    14. int[] even = centerDiffusion(s, i, i + 1);
    15. // 先比较当前的max出来,再与全局的res比较
    16. int[] max = odd[1] > even[1] ? odd : even;
    17. if (max[1] > resLen) {
    18. // 如果当前max的长度大于全局res的长度,就重新赋值
    19. res = max;
    20. resLen = max[1];
    21. }
    22. }
    23. // 返回子串,以res[0]为起始下标,长度共res[1],所以结束下标为res[0]+res[1]
    24. // substring(int beginIndex, int endIndex)
    25. return s.substring(res[0], res[0] + res[1]);
    26. }
    27. public static int[] centerDiffusion(String s, int left, int right) {
    28. int len = s.length();
    29. int[] res = new int[2];
    30. while (left >= 0 && right <= len - 1) {
    31. if (s.charAt(left) != s.charAt(right)) {
    32. break;
    33. } else {
    34. left--;
    35. right++;
    36. }
    37. }
    38. // 针对在这里的处理是指:原本是遍历到不等的left与right就结束,那么刚才相等的左下标为left+1,右下标为right-1
    39. // 不然也不可能执行自增/减操作扩展到left和right
    40. // 针对一开始就不等的可能的even情况,那么就会发现其返回的回文串长度为0
    41. // 就是特殊情况合并到一般情况。
    42. return new int[]{left + 1, right - left - 1};
    43. }
    44. }