最长回文子串

Posted

技术标签:

【中文标题】最长回文子串【英文标题】:Longest Palindromic substring 【发布时间】:2017-04-05 12:06:20 【问题描述】:

我一直在解决一些问题来为我的期中考试做准备,但我无法弄清楚是什么导致了这个错误。问题表明

"问题是寻找一个最大长度的连续子串的问题 给定的字符串也是回文。 写一个给定字符串s的Java方法longestPalindrome,它返回最长的回文子串。 例如,“bananas”的是“anana”。最长的回文子串是 不保证是唯一的;例如,在字符串“abracadabra”中,没有回文子串 长度大于三,但有两个长度为三的回文子串,即“aca”和“ada”。 因此,您的方法应该返回具有最大长度的第一个子字符串。在这种情况下,“aca”。”

所以我把这个问题分为2个方法(不包括main方法)这是我的代码:

public static String pali(String s)  
    int i = 0;
    int j = s.length()-1;
    String result = "";
    while (i<s.length()/2)
    
        if (s.charAt(i) == s.charAt(j))
            if (palicheck(s.substring(i,j+1)) == true)
                break;
            i++;
            j--;
    
    return s.substring(i,j+1);


public static boolean palicheck(String s)
    int i = 0;
    int j = s.length()-1;
    boolean flag = true;
    while(i<s.length()/2)
        if (s.charAt(i) == s.charAt(j) && flag == true)
            flag = true;
        else
            flag = false;
        i++;
        j--;
    

    return flag;

好的,所以我的代码所做的是它需要第一个和最后一个索引并检查它们是否相同,如果它们相同,它将检查它们之间是否包含字符串,如果不是,它'会将它们移动 1 个单位。 我的问题是,无论我输入什么,我总是得到字符串的第一个字符,例如,如果我输入“bananas”,我会得到 b。 请帮我!对不起,如果我遗漏了什么这是我第一次在这里发帖。

(我正在使用非常基本的解决方法,因为这是我大学的第一年,也是我第一次接触编程所以请多多包涵!^_^)。

我搞定了,只需要改变这些:

if (palicheck(s.substring(i,j+1)) == true) break; else i++; j-- 我完全删除了 else,也在 Palicheck 中我添加了 j-- 因为我也忘记了

【问题讨论】:

在您的 palicheck 函数中,您没有在循环内更新 i,因此您进入了无限循环 啊,我忘记了,我添加了它,但我仍然得到相同的错误,只获取第一个字符(例如香蕉中的 b)。我不确定,但这可能与我在 pali 方法中返回值的方式有关吗? 您应该尝试添加一个打印语句来打印在pali 函数的while 循环的每次迭代中检查的字符串。看起来“香蕉”会发生什么将检查以下字符串。 “香蕉”、“香蕉”、“香蕉”、“香蕉”、“禁令”、“巴”、“b”。对于“b”,palicheck 函数返回 true,因此您退出 pali 中的 while 循环并返回“b”作为结果。对于此输入,您根本不会踩到 i 索引。所以算法是有缺陷的。 先更正你的palicheck函数,不正确。在 else 中,您必须立即中断循环并返回 false。否则 flag 将只取最后一个评估字符的值。 @Alderath 我修复了palicheck 方法,我还从pali 方法中删除了else 部分以测试会发生什么,我得到了“nan”所以我所要做的就是玩耍在我做对之前使用索引值? 【参考方案1】:
import java.util.Scanner;

public class palindromicSubstring 

    public static void main(String[] args) 
        Scanner sc=new Scanner(System.in);


        String str,substring="",longest="";

        int len,i,j,k;
        System.out.println("Enter String");
        str=sc.nextLine();
        len=str.length();
        for(i=0;i<=len;i++) 
            for(j=0,k=i;k<=len;j++) 

            substring=str.substring(j,k);
            if(palindrome(substring))
                longest=substring;
            k++;
        
        
        System.out.println(longest);


    
    static boolean palindrome(String str)
    
        int len=str.length();
        int i;
        String temp="";
        for(i=len-1;i>=0;i--) 
            temp=(temp+str.charAt(i));
        
        if(temp.equals(str)) 
            return true;
        else return false;



    


【讨论】:

【参考方案2】:

我在一次面试代码挑战中遇到了这个问题,我按照上面的方法解决了:

    import java.util.SortedMap;
import java.util.TreeMap;


public class MainClass 
    public static void main(String[] args) 
        findLargestPallindrom("aadwfaafw");
        findLargestPallindrom("billkrbatcctabrasdfasfdabcba");
        findLargestPallindrom("assdfdssa");
        findLargestPallindrom("asffsabc");
        findLargestPallindrom("bb");
    

    private static void findLargestPallindrom(String string) 
        SortedMap<Integer, String> pallindroms = new TreeMap<>();

        int largestLength=0;
        for(int i =0; i< string.length()-1; i++)
        
            if(string.charAt(i)==string.charAt(i+1))
            
                largestLength =2;
                pallindroms.put(2, string.substring(i, i+2));
                //System.out.println(string.substring(i, i+2));
            
        

        String sub;
        //check different length of substrings for being pallindrom:
        for(int i=3; i<=string.length(); i++) 
            for(int k=0; k+i < string.length()+1; k++) 
                if(k+i+1 >= string.length()) 
                    sub = string.substring(k);
                
                else 
                    sub = string.substring(k, k+i+1);
                

                if(MainClass.isPallindrom(sub)) 
                    //System.out.println("added large substring is: "+sub);
                    pallindroms.put(i, sub);
                
            
        

        if(!pallindroms.isEmpty()) 
            System.out.println("largest palindrome substring is:" + pallindroms.get(pallindroms.lastKey()));
        
        else System.out.println("There is no pallindrom");
    

    static boolean isPallindrom(String s) 
        StringBuilder sb = new StringBuilder(s);
        if(s.equals(sb.reverse().toString())) 
            return true;
        
        return false;
    

【讨论】:

【参考方案3】:

C#解决方案:

public string LongestPalindrome(string s) 
        var n = s.Length;
            var data = new bool[n, n];
            var result = string.Empty;

            for (var len = 1; len <= n; len++)
            
                for (var start = 0; start < n; start++)
                
                    var end = start + len - 1;
                    if (end >= n)
                        break;
                    data[start, end] = (len == 1 || len == 2 || data[start + 1, end - 1]) && s[start] == s[end];
                    if (data[start, end] && len > result.Length)
                    
                        result = s.Substring(start, len);
                    
                
            
            return result;
    

【讨论】:

以上是关于最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-005-最长回文子串

最长回文子串--动态规划

求最长回文子串,O(n)复杂度

回文子串解法大全

求最长回文子串,O(n)复杂度

最长连续公共子串最长公共子串(可以非连续)最长回文串(连续)最长回文串(可以不连续)最长递增数组的求解