讨论/算法和数据结构/题库第14题,有大哥来帮帮忙的,实在是没招了/
题库第14题,有大哥来帮帮忙的,实在是没招了

下面是错误信息,这个例子我在eclipse上可以运行成功,到leetcode上就不行了

image.png

在leetcode的Playground中又出现下面的错误,然后我就懵了

image.png

这是代码

class Solution {
    public String longestCommonPrefix(String[] strs) {
        //定义公共部分
		String tempString = "";
		boolean flag = true;
		
		//判断字符数组为空和数组中的字符串为空,都会导致越界问题
		if(strs.length == 0 || strs[0] == ""){
			return tempString ;		
		}
        
        for(int i = 0 ; i < strs.length; i++){
            if(strs[i] == "")
            return tempString ;
        }
		
		for (int i = 0; flag ; i++) { //这里要考虑如果相同前缀很长的情况
			
			 //临时变量固定需要比较的字符串
			 tempString = strs[0].substring(0, i+1);
			 
			 //拿临时变量逐一比较后面的每一个字符串
			 for (int j = 1; j < strs.length; j++) {
				//判断字符是否相同 
				 
				if(!(tempString.equals(strs[j].substring(0, i+1)))){
					flag = false;
					break;
				}
			}
			 
			 //判断是否比较失败
			 if(!flag){
				 //防止数组越界
				 if(i == 0){
					 tempString = "";
				  //判断失败,将tempString重新赋值
				 }else{
					 tempString = strs[0].substring(0, i);
					 break;//记着加break跳出外层循环
				 }
			 }
		}
		return tempString;
    }
}
展开讨论
共 4 个讨论

你越界了,代码里第二个for循环条件考虑不全面,有可能会死循环

1

你这样看,当数据只有一个元素["a"]的时候。for (int i = 0; flag ; i++){}里的flag一定不会发生改变,那么就是一个死循环。
i = 1时,strs[0].substring(0, i+1)会取到strs[0][1]这个元素。那必然就越界了。也就是indexOutOfBounds的情况。看错误信息的时候可以看看编译器报错的类型和输入数据。要是还有问题的话,建议看看习题后的题解。我写了份图示题解,代码是c++的,可以参考一下。看不懂的话,可以看看别人写的java题解。

1

你直接比一下第一个字符是否都相同,第二个字符是否都相同,一直到这些字符中长度最短的那个字符是否相同就可以了。中间只要有一个字符不相同就直接输出这时的长度。

另外,如果实在写不出来可以看看题解,没必要死磕,看看别人的思路,自己再尝试着改一下代码,记好笔记就行了。

Java没问题。
你的错误可能在26行,substring 越界。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0 || strs[0].length() == 0) {
            return "";
        }
        int n = strs[0].length();
        for (int i = 1; i < strs.length; ++i) {
            if (strs[i].length() < n) {
                n = strs[i].length();
            }
            for (int j = 0; j < n; ++j) {
                if (strs[i].charAt(j) != strs[0].charAt(j)) {
                    n = j;
                }
            }
        }
        return strs[0].substring(0, n);
    }
}