最长的回文子串

时间:2017-04-05 12:06:21

标签: java palindrome

我一直在解决一些问题,为我的期中考试做准备而且我无法理解导致这一错误的原因。问题表明

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

所以我把这个问题分成了2个方法(不包括主方法),这是我的代码:

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个单位。 我的问题是我输入的内容,我总是得到字符串的第一个字符,例如,如果我输入“香蕉”,我会得到b。 请帮我!对不起如果我遗漏了任何东西这是我第一次在这里发帖。

(我正在使用非常基本的解决方法,因为这是我在大学的第一年,也是我第一次处理编程所以请耐心等待我!^ _ ^)。

我得到了它,只改变了这些:

if (palicheck(s.substring(i,j+1)) == true) break; else i++; j-- 我完全删除了其他人,同样在Palicheck我添加了j--因为我已经忘记了那个

3 个答案:

答案 0 :(得分:0)

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;



    }

}

答案 1 :(得分:0)

我遇到了一个面试代码挑战的问题,并且如上所述解决了该问题:

    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;
    }
}

答案 2 :(得分:0)

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;
    }