子串索引超出范围

时间:2016-12-30 02:20:05

标签: java substring palindrome

我正在编写一个简单的程序来查找字符串中最长的回文。我正在做的是检查每个子串是否是回文,然后检查它的长度。如果长度大于前一个长度,那么我有新的最长子串。例如,“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;
    }
}

当我打印出来时,我得到所有子串组合,直到“babbad”之后才发生错误。

4 个答案:

答案 0 :(得分:0)

因此,我的代码中的错误结果是当我按照评论中的一些人指出的i&gt; j时。因此,在搜索回文时简单地使j = i解决了这个问题。

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

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

答案 1 :(得分:0)

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

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

j

的下一个循环相似

不这样做可能会导致索引超出界限。

答案 2 :(得分:0)

您需要更改循环条件。它应该只是&lt;不是&lt; =。因为如果你检查一下'babad&#39;的长度?它会给你5但索引从0开始,到4结束。所以你需要改变循环条件,它将解决问题。

答案 3 :(得分:0)

问题的A部分 - 编译器错误

  1. 正如其他人指出的那样,将您的外圈从for(int i = 0;i<=s.length();i++)更改为for(int i = 0;i<s.length();i++)
  2. 将内圈从for(int j = 0; j<= s.length();j++)更改为for(int j = i; j< s.length();j++)
  3. 你的程序让你超出异常,因为在你的外循环的第二次迭代中,你的i变为1而j从0开始。然后你将String的子串方法称为s.substring(1,0);这显然给你了这个例外。

    按照建议进行更正并从那里开始。如果您需要更多帮助,请告诉我们。

    问题的B部分 - 更快的算法

    这是一种更有效的算法。我相信这也应该是最快的。

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

    如果您需要其他帮助,请与我们联系。