• Longest Palindromic Substring2015年6月20日


    Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

    自己的解决方案;

    public class Solution {
    StringBuilder longest = new StringBuilder("");
    
    public String longestPalindrome(String s) {
            String ss;
            int len = s.length();
            int max = 0;
            int sublen = 0;
            String result = "";
            for (int i = 0; i < len; i++) {
                for (int j = i + 1; j < len; j++) {
                    ss = s.substring(i, j);
                    int index = s.indexOf(reverse(ss),j-1);
                    if (index == j - 1) {
                        sublen = 2 * (j - 1 - i) + 1;
                        if (sublen > max) {
                            max = sublen;
                            result = s.substring(i, max+i);
                        }
                        continue;
                    } else if (index == j) {
                        sublen = 2 * (j - i);
                        if (sublen > max) {
                            max = sublen;
                            result = s.substring(i, max+i);
                        }
                        continue;
                    } else {
                        continue;
                    }
                }
            }
    
            return result;
        }
    
        public String reverse(String s) {
            StringBuilder sb = new StringBuilder(s);
            sb.reverse();
            return sb.toString();
        }
    }

    方法正确性是没有问题的,先挨个取子串,查找反串。但在LeetCode上会报超时错误。

    参考讨论区的解答 

    Runtime: 344 ms

    在所有JAVA程序里相对靠前

    public class Solution {
    StringBuilder longest = new StringBuilder("");
    
    public String longestPalindrome(String s) {
        if (s.length() <= 1) return s;
    
        for (int i = 0; i < s.length(); i++) {
            expand(s, longest, i, i); //odd
            expand(s, longest, i, i + 1); //even
        }
    
        return longest.toString();
    }
    
    private void expand(String s, StringBuilder longest, int i, int j) {
        while (i >= 0 && j < s.length()) {
            if (s.charAt(i) == s.charAt(j)) {
                if (j - i + 1 > longest.length()) {
                    longest.delete(0, longest.length());
                    longest.append(s.substring(i, j + 1));
                }
                i--;
                j++;
            }
            else
                break;
        }
    }
    }

     代码剖析:

    以字符串basdsa为例:
    
    0 1 2 3 4 5
    b a s d s a
    
    i=0:
    
    odd对应的while循环执行
    i=0,j=0
    if (s.charAt(i) == s.charAt(j)) 满足  longest=b
    even对应的while循环不满足 if (s.charAt(i) == s.charAt(j))条件break
    
    i=1:
    
    odd对应的while循环执行
    i=1,j=1
    if (j - i + 1 > longest.length()) 不满足
    i=0,j=2  if (s.charAt(i) == s.charAt(j)) 不满足循环退出
    even对应的while循环不满足 if (s.charAt(i) == s.charAt(j))条件break
    
    i=2:
    
    odd对应的while循环执行
    i=2, j=2
    if (j - i + 1 > longest.length()) 不满足
    i=1,j=3  if (s.charAt(i) == s.charAt(j)) 不满足循环退出
    even对应的while循环不满足 if (s.charAt(i) == s.charAt(j))条件break
    
    i=3:
    
    odd对应的while循环执行
    i=3, j=3
    if (j - i + 1 > longest.length()) 不满足
    i=2,j=4  if (s.charAt(i) == s.charAt(j)) 满足 longest=sds
    i=1,j=5  if (s.charAt(i) == s.charAt(j)) 满足 longest=asdsa
    i=0,j=6不满足while条件退出
    even对应的while循环不满足 if (s.charAt(i) == s.charAt(j))条件break
    
    i=4:
    
    odd对应的while循环执行
    i=4, j=4
    if (j - i + 1 > longest.length()) 不满足
    i=3,j=5  if (s.charAt(i) == s.charAt(j)) 不满足循环退出
    even对应的while循环不满足 if (s.charAt(i) == s.charAt(j))条件break
    
    i=5:
    
    odd对应的while循环执行
    i=5, j=5
    if (j - i + 1 > longest.length()) 不满足
    i=4, j=6不满足while条件退出
    even对应的while不满足while条件退出
  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/hixin/p/4591058.html
Copyright © 2020-2023  润新知