LeetCode初级题-----最长公共前缀

最长公共前缀
题目要求:
编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: "fl"

示例 2:

输入: [“dog”,“racecar”,“car”]
输出: ""

解释: 输入不存在公共前缀。

说明:

所有输入只包含小写字母 a-z 。

题目分析:
目的是查找最长前缀是什么?那么解决办法就是使用一个字符记录字符串第一位的字符,之后通过遍历数组来得到每一个数组第一位的字符,和记录的字符相比较,相同则加到等待传出的字符串。之后的位数依此类推。

我的解决代码:

class mySolution {
	public String longestCommonPrefix(String [] strs) {
		String string = String.valueOf("");
		char pop;
		int i = 0,length = strs.length;
		boolean isCommon = true;
		while(true) {
			try {
				isCommon = true;//用来判断字符是不是相同
				pop = strs[0].charAt(i);//记录第一位数字
				for(int j  = 1; j < length; j++) {
					if(strs[j].charAt(i) != pop) {//遍历数组
						isCommon = false;	break;
					}
				}
				if(isCommon == true) {
					string += pop;	i++;//加到字符串上,之后开始下一位的比较
				} else {
					break;
				}
			} catch(StringIndexOutOfBoundsException ex) {
				isCommon = false;	break;
			} catch(ArrayIndexOutOfBoundsException ex) {
				isCommon = false;	break;
			}
		}
		return string;
	}
}

这里面出现了两个异常,分别捕捉,在遍历数组的时候,可能出现数组下标越界。
第二个就是在执行strs[j].charAt(i) != pop代码的时候,可能字符串下标越界StringIndexOutOfBoundsException
但是我的代码是有很大问题的,当catch之后最好不要什么都不做,最好进行一些合理的处理。ps:执行时间12ms

LeetCode官方解决办法
(1)水平扫描法

下面代码当中有一个方法是strs[i].indexOf(prefix) != 0这个的方法返回的是字符串prefix首次出现的索引,当返回的值不是0的话,说明字符串子串没出现过,需要变短字符串。当都不符合条件的时候,字符串为空,那么返回空的字符串。

public String longestPrefix(String [] strs) {
		String prefix = strs[0];
		int length = strs.length;
		for(int i = 1; i < length; i++) {
			while(strs[i].indexOf(prefix) != 0) {
				//当没出现字符串的时候,可能是字符串太长了,减去尾部的一个字符
				prefix = prefix.substring(0, prefix.length() - 1);
				if(prefix.isEmpty()) return "";//当字符串是空的时候
			}
		}
		return prefix;
	}

运行时间:10ms
还有其他的解决办法,比如说:横向扫描,纵向扫描(好像刚才就是哈)但是暂时没看懂,等着我更新吧…

不对的依然要帮我指出来哈。

猜你喜欢

转载自blog.csdn.net/qq_43073128/article/details/88084360