gpt4 book ai didi

java.lang.StringIndexOutOfBoundsException : String index out of range: -1 (Works with another program)

转载 作者:行者123 更新时间:2023-12-02 03:14:45 26 4
gpt4 key购买 nike

我应该创建一个程序来查找 DNA 字符串中最长的回文。与常规回文程序不同,此程序需要 A 与 T 匹配,C 与 G 匹配(因此,我们使用 TCGA 代替 1221)。经过我自己的尝试,我确实找到了一个非常好的程序来解决正常的回文问题,即这个网站上的程序: http://www.journaldev.com/530/java-program-to-find-out-longest-palindrome-in-a-string

然后我尝试修改它以满足我的需要。基本上我所做的更改如下:

  1. 我从参数行读取了一个字符串,而不是示例中显示的那些字符串。该字符串是以下 DNA 序列(尽管我仅使用其中的一部分测试了该程序):

http://introcs.cs.princeton.edu/java/31datatype/genomeVirus.txt

  • 代替命令

     while (left >= 0 && right < s.length()
    && s.charAt(left) == s.charAt(right)) {
    left--;
    right++;
    }
  • 我做到了:

    while (left >= 0 && right < s.length()
    && s.charAt(left) == 'A' && s.charAt(right) == 'T' || s.charAt(left) == 'T' && s.charAt(right) == 'A'
    || s.charAt(left) == 'G' && s.charAt(right) == 'C' || s.charAt(left) == 'C' && s.charAt(right) == 'G')
    {
    left--;
    right++;

    (完整代码如下)

    但是,当我在字符串上尝试这个程序时,我总是收到错误:

    java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at LongestPalindrome.intermediatePalindrome(LongestPalindrome.java:17)
    at LongestPalindrome.longestPalindromeString(LongestPalindrome.java:26)
    at LongestPalindrome.main(LongestPalindrome.java:5)

    我就是不明白!我不知道如何摆脱字符串,当我尝试链接到的原始程序时,无论哪个字符串它总是适用。我觉得我做的一切都是正确的,只需将 == 命令替换为各种应该有意义的场景即可。

    我认为这可能与以下内容有关

    return s.substring(left+1, right);"

    我试图取消+1,但这似乎破坏了整个交易。我只是不知道如何摆脱弦,因为在我调整之前它工作得很好。

    任何帮助将不胜感激!下面是代码!

    public class LongestPalindrome {

    public static void main(String[] args) {
    String gen = new String(args[0]);
    System.out.println(longestPalindromeString(gen));
    }

    static public String intermediatePalindrome(String s, int left, int right) {
    if (left > right) return null;
    while (left >= 0 && right < s.length()
    && s.charAt(left) == 'A' && s.charAt(right) == 'T' || s.charAt(left) == 'T' && s.charAt(right) == 'A'
    || s.charAt(left) == 'G' && s.charAt(right) == 'C' || s.charAt(left) == 'C' && s.charAt(right) == 'G')
    {
    left--;
    right++;
    }
    return s.substring(left+1, right);
    }

    // O(n^2)
    public static String longestPalindromeString(String s) {
    if (s == null) return null;
    String longest = s.substring(0, 1);
    for (int i = 0; i < s.length() - 1; i++) {
    //odd cases like 121
    String palindrome = intermediatePalindrome(s, i, i);
    if (palindrome.length() > longest.length()) {
    longest = palindrome;
    }
    //even cases like 1221
    palindrome = intermediatePalindrome(s, i, i + 1);
    if (palindrome.length() > longest.length()) {
    longest = palindrome;
    }
    }
    return longest;
    }

    }

    最佳答案

    1. 您正在使用 right == 0 调用它。您需要将第一个调用更改为:

       String palindrome = intermediatePalindrome(s, i, i+1)
    2. 运算符优先级问题。您添加了一些 ||即使范围检查失败也会评估这些条件。应该是:

      while (left >= 0 && right < s.length()
      && (s.charAt(left) == 'A' && s.charAt(right) == 'T'
      || s.charAt(left) == 'T' && s.charAt(right) == 'A'
      || s.charAt(left) == 'G' && s.charAt(right) == 'C'
      || s.charAt(left) == 'C' && s.charAt(right) == 'G'))

    请注意第二个 && 的整个第二个操作数周围的括号。

    关于java.lang.StringIndexOutOfBoundsException : String index out of range: -1 (Works with another program),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40476133/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com