索引之外的字符串:java.lang.ArrayIndexOutOfBoundsException。字符串可能溢出

时间:2018-12-08 17:30:19

标签: java string

class Solution {
    public String longestCommonPrefix(String[] strs) {    
        String result = new String("");
        char compareElement;
        int i;//index of strs
        int j;//index of the first one of string
        for(j = 0; j < strs[0].length(); j++){
            compareElement = strs[0].charAt(j);
            for(i = 1; i < strs.length; i++){
                if(compareElement == strs[i].charAt(j)){
                    if(i == strs.length - 1)
                        result += compareElement;
                    else
                        continue;
                }
                else{
                    break;
                }
            }
        }

        return result;
    } 
}

测试样品是

Input: ["flower","flow","flight"]
Output: "fl"

嗨,我在Leetcode的第四个小程序中遇到了Java字符串问题。此功能的目的是在字符串数组中找到最长的公共前缀字符串。但是例外

Exception in thread "main" 
java.lang.StringIndexOutOfBoundsException: String index out of 
range: 4
at java.lang.String.charAt(String.java:614)
at Solution.longestCommonPrefix(Solution.java:11)
at __DriverSolution__.__helper__(__Driver__.java:4)

再次出现。 有人知道吗?谢谢!

3 个答案:

答案 0 :(得分:0)

我认为这是您出问题的地方:

if(compareElement == strs[i].charAt(j))

j0strs[0].lenght()可能会变得太大(请参阅外部循环)。

如果strs[i].lengt()小于strs[0].length(),则会得到StringIndexOutOfBoundsException

答案 1 :(得分:0)

当您遍历比较字符串时,您永远不会检查要比较的字符串的长度。在您的示例中,测试用例flow。索引4处的char不存在,因为仅定义了索引0-3。 if(compareElement == strs[i].charAt(j)){当j为4时会混乱。为了修复它,您必须确保不超过字符串的长度。除了查找StringBuilder是什么之外,对于这么小的测试用例,也没有关系,但是随着您的增大,它会变得越来越重要。

答案 2 :(得分:0)

如果数组中的元素比第一个元素短,则您的代码将失败。您需要检查j是否仍小于要比较的字符串的长度:

    public String longestCommonPrefix(String[] strs) {
    String result = new String("");
    char compareElement;
    int i;// index of strs
    int j;// index of the first one of string
    for (j = 0; j < strs[0].length(); j++) {
        compareElement = strs[0].charAt(j);
        for (i = 1; i < strs.length; i++) {
            if (j < strs[i].length() && compareElement == strs[i].charAt(j)) {
                if (i == strs.length - 1)
                    result += compareElement;
                else
                    continue;
            } else {
                break;
            }
        }
    }

    return result;
}