Java 子字符串索引超出范围

Java 子字符串索引超出范围,java,substring,palindrome,Java,Substring,Palindrome,我正在写一个简单的程序来查找字符串中最长的回文。我要做的是检查每个子字符串是否是回文,然后检查其长度。如果长度大于以前的长度,则我有新的最长子字符串。例如,“babad”将返回“bab”或“aba”,两者都可以。但我的问题是,我在子字符串调用中得到了超出范围的索引,我不知道为什么 public class LongestPal{ public static void main(String[] args) { String test = new String("b

我正在写一个简单的程序来查找字符串中最长的回文。我要做的是检查每个子字符串是否是回文,然后检查其长度。如果长度大于以前的长度,则我有新的最长子字符串。例如,“babad”将返回“bab”或“aba”,两者都可以。但我的问题是,我在子字符串调用中得到了超出范围的索引,我不知道为什么

public class LongestPal{
    public static void main(String[] args)
    {
        String test = new String("babad");
        String result = longestPalindrome(test);

    }
    public static String longestPalindrome(String s) {
        int length = 0;
        String answer = new String();

        for(int i = 0;i<=s.length();i++)
        {
            for(int j = 0; j<= s.length();j++)
            {
                String subStr = s.substring(i,j); // Get all substrings
                System.out.println(subStr); // Checking to see if all are printed

                boolean result = isPalindrome(subStr); //Check for palindrome
                if(result)
                {
                    if(length < subStr.length()) //If length of new substr is greater than the old one, 
                                                //the new answer will be longer substring
                    {
                        answer = subStr;   
                    }
                }
            }
        }
        return answer;
    }
    public static boolean isPalindrome(String s) //Recursive palindrome checker
    {
        if(s.length() == 0 || s.length() == 1)
            return true; 
        if(s.charAt(0) == s.charAt(s.length()-1))
            return isPalindrome(s.substring(1, s.length()-1));
        return false;
    }
}
公共类LongestPal{
公共静态void main(字符串[]args)
{
字符串测试=新字符串(“babad”);
字符串结果=最长回文(测试);
}
公共静态字符串最长回文(字符串s){
整数长度=0;
字符串应答=新字符串();

对于(inti=0;i,我的代码中的错误是当i>j时,正如一些人在评论中指出的那样。因此,在搜索回文时简单地使j=i就解决了这个问题

您还将注意到,您从未看到长度更改,这是代码中的另一个错误。答案更新后,长度必须更改为答案的长度。对此的一个简单修复方法是在第二个“if”语句中设置length=subStr.length()


该算法仍然不够快,因为它将以O(n^3)的复杂度运行。

您不应该从0迭代到s.length-1吗? 这意味着您的循环条件为:

for(int i = 0;i<s.length();i++)

对于(int i=0;i您需要更改循环条件。它应该只是问题的A部分-编译器错误


  • 将外部循环从
    更改为(int i=0;i“例如,“babbad”,将返回“bab”或“aba”都可以。”…aba?@Tom OP可能想说abba…可能是打字错误?当
    j
    时,您预期会发生什么?问题在于:
    s.substring(i,j)
    。正如@Jyr所提到的,在某一点上,我
    ,这就是错误发生的原因。哦,天哪,我完全明白你的意思。这对我来说有点愚蠢,谢谢@Jyr。所做的更改并没有真正产生不同的答案。无论是否没有更改,这两种方法都会让我得到相同的结果。我想你的意思是你仍然得到了索引越界异常?我认为您确实需要重新编写算法,它接近O(n^3)而不是(n^2)。子字符串方法也是O(n)成本过程。我预计它会非常慢。也不确定jOh否,我说的不更改是指索引超出范围是固定的,但从更改后我确实更改了它,但似乎对运行它的测试用例没有影响。出现这种情况有什么原因吗?解决方案是有效的,但在O(n^3)左右运行时速度非常慢,现在这适用于较小的测试用例。但是如果字符串非常大,毫无疑问我会遇到问题。这与您最初在主帖子中强调的问题不同。请将您的问题作为单独的帖子发布。Stackoverflow通常不允许用户发布与更好或更快编写代码有关的问题完全了解这一点,我之所以提到它,是因为另一个解决方案已经解决了。我将对此进行一段时间的研究,但我感谢您的关注。酷。我已经对答案进行了编辑。我提供了一个示例算法,应该比您的迭代次数少。如果您面临任何其他问题,请告诉我。实际上,通过您所做的编辑,我我之前通过的测试用例失败。测试用例是“cbbd”,答案应该是“bb”。
        public static void main(String[] args) {        
        String s = "babad";
    
        int starter = 0;
    
        if(s.length() % 2 == 0) 
            starter = 1;
    
        String answer = "";
        Boolean found = Boolean.FALSE;
        while(starter < s.length() - 1) {
            for(int i=0; i<=starter; i++) {
                if(isPelindrom(answer = s.substring(i, i+ s.length() - starter))) {
                    found = Boolean.TRUE;
                    break;
                }
            }
            if(found) break;
            starter = starter + 1;          
        }
        if(!found) answer = String.valueOf(s.charAt(0));
        System.out.println("The answer is " + answer);
    
    }
    
    public static Boolean isPelindrom(String s) {
        return s.equalsIgnoreCase(new StringBuilder(s).reverse().toString());
    }