1. 题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
说明:
所有输入只包含小写字母 a-z 。
2. 示例
3. 思路
- 只要对比数组里面每个字符串里面的相同下标保存的值是否相同即可。
4. 遇上的问题
- 没做出来之前就怀疑自己这样做会不会导致自己的算法两次循环消耗太多!因为暂时没想到别的方法就硬着头皮做下去。
- 一些临界值条件没有考虑到,输入值为空啊,输入值为双引号啊
5. 具体实现代码
自己写的代码
class Solution {
public String longestCommonPrefix(String[] strs) {
//输入值为空的时候直接返回
if(strs.length<1) return "";
//用来保存第一个值,然后和其他字符串相同下标的值进行比较
char temp=' ';
//用于动态增加字符串
StringBuilder sb = new StringBuilder();
//通过循环对比字符串
//外循环,第一个字符串里面的字符
a:for(int i = 0;i<strs[0].length();i++){
temp=strs[0].charAt(i);
//内循环,循环对比其他的值
b:for(int j = 1;j<strs.length;j++){
//存在两种情况跳出字符串,
//第一种是i值大于要遍历的字符串的长度,
//第二种是相同坐标下的值不相等
if(i>=strs[j].length()||temp!=strs[j].charAt(i)){
break a;
}
}
//遍历一边都相等,把字符加到StringBuilder里面去
sb.append(temp);
}
//用来判读,如果sb对象里的值为初始值,
//则意味着没有添加。直接返回
if(sb.indexOf(" ")==0){
return "";
}
return sb.toString();
}
}
6. 学习收获,官方一如既往的妙啊
- 官方这次真的很牛啊,讲了四种思路,第一种是水平的,我感觉水平的会让人更好理解。让第一个字符数为前缀,然后和后面的字符串比长度,谁小就截取原前缀从0到最小长度的值,遍历完就取出来了,妙啊!没有想到水平的取法。
- 第二种的话,我和官方差不多,不过它没有截取放到一个新的对象里,而是记录下标,然后通过String的subString(index,length)方法来截取返回,妙啊!我又回顾了一个String方法。
- 第三种是分治,不断将数组从中间切开切成两半(递归的过程),到最后进行相邻两个数进行字符上的判断,返回(两者)最长的公共字符串(递归出口),然后依次比较返回的最长公共字符前缀,最后得出一个整体上的最长公共前缀。
- 第四种是二分查找,这种二分查找需要先找到传进来数组的最短字符串的长度,根据最小长度除以2的中值来进行遍历,让每次的也是利用遍历字符串里相同坐标的值是否相等的方式,如果再这个长度里面相等则从中间往上遍历(以传进来的字符数组的长度来说),如果不等就从高位见减一,从新计算。
7 题目来源
完成了第二个加油加油欧里给! ------swrici