zoukankan      html  css  js  c++  java
  • 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条件退出
  • 相关阅读:
    递归要记得返回
    git push的时候报Unable to find remote helper for 'https'的错误
    iphone手机上的click和touch事件
    对jquery的conflict方法的解读
    开发富文本编辑器的一些体会
    使用jquery制作动态加载型菜单
    解决jquery$命名符和其它框架的冲突问题
    基于geolocation来获取经纬度地址
    Python学习笔记2解析数据
    Python学习笔记1数据类型
  • 原文地址:https://www.cnblogs.com/hixin/p/4591058.html
Copyright © 2011-2022 走看看