先看题目...
//编写一个函数来查找字符串数组中的最长公共前缀。 // // 如果不存在公共前缀,返回空字符串 ""。 // // 示例 1: // //输入:strs = ["flower","flow","flight"] //输出:"fl" // // 示例 2: // //输入:strs = ["dog","racecar","car"] //输出:"" //解释:输入不存在公共前缀。 // // 提示: // // 1 <= strs.length <= 200 // 0 <= strs[i].length <= 200 // strs[i] 仅由小写英文字母组成
先理一下思路...
我用的思路是
首先找到数组中第一个元素的第一个字符,并且用charAt方法记录这个字符...
遍历整个数组的每个元素的相同索引位置.若每个相同索引的字符相同,则添加这个字符进入SrtingBuilder
注意:是在这个字符比较完整的String数组中所有数据之后才添加进StringBuilder对象
若遇到不一样的字符,直接跳出循环,return即可
运行代码...
class Solution {
public String longestCommonPrefix(String[] strs) {
//StringBuilder用来储存最后的结果
StringBuilder sb = new StringBuilder();
//length既标识了sb中的字符长度,同时也注释了当时char c应当比较哪个数组中元素的哪个字符
int length = 0;
char c = 0;
//整个的查找过程,思路同一开始的思路分析
loop:
while (true) {
c = strs[0].charAt(length);
for (int i = 0; i < strs.length; i++) {
if (strs[i].charAt(length) != c) {
//若当前数组字符串中的字符不等于char c这个字符则直接跳出while循环就行了
break loop;
}
}
//若都相等就把c加入sb对象当中
sb.append(c);
//为下一次比较元素做标记
length++;
}
//结束while循环直接输出sb.toString即可
return sb.toString();
}
}
报错...
重新理思路之后发现了第一个问题:
c = strs[0].charAt(length); 这行代码若strs=null的话,直接就会索引越界...我选择直接用try...catch捕捉这个异常.或者用if判断也可以做到try...catch的功能
修改后的代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
StringBuilder sb = new StringBuilder();
int length = 0;
char c = 0;
loop:
while (true) {
//try...catch的起始
try {
c = strs[0].charAt(length);
} catch (Exception e) {
//重点在这里越界做判断
if (strs.length == 0) {
return "";
}
}
for (int i = 0; i < strs.length; i++) {
if (strs[i].charAt(length) != c) {
break loop;
}
}
sb.append(c);
length++;
}
return sb.toString();
}
}
结果又报错了~~~
用Debug跑了一下代码,发现第二个问题了:
for循环时候不能保证循环中的某些单词还有长度
又拿try...catch捕捉了下异常
class Solution {
public String longestCommonPrefix(String[] strs) {
StringBuilder sb = new StringBuilder();
int length = 0;
char c = 0;
loop:
while (true) {
try {
c = strs[0].charAt(length);
} catch (Exception e) {
if (strs.length == 0) {
return "";
}
}
try {
for (int i = 0; i < strs.length; i++) {
if (strs[i].charAt(length) != c) {
break loop;
}
}
} catch (Exception e) {
return sb.toString();
}
sb.append(c);
length++;
}
return sb.toString();
}
}
for循环里报错直接返回sb对象就行了.因为报错就证明当时遍历的单词结尾了,所以就代表已经记录完相同的字符串了.
最后运行通过了