原题目链接:14. 最长公共前缀
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
0 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题思路:
- 在比较之前,得先对传进来的字符串数组进行判断,判断条件是。不为空而且长度不为0
- 我们以纵向比较为思路,什么意思呢?
- 说白了就是先取出第一个字符串strs[0],然后取出字符串strs[0]的第一个的字符c,用这个c去跟剩余的字符串的第一个的字符比较
3.1 如果相同,不管,因为strs[0]的字符串已经包含了这些公共前缀
3.2 如果不同,结束循环,由于strs[0]的字符串已经包含了这些公共前缀,那么只需要对strs[0]字符串进行截取,循环到哪里,就截取到哪里
3.3 最后一种情况,当strs[0]字符串还没循环完,此时发现在strs[]数组中,存在字符串的长度是小于strs[0]字符串长度,因为当我们知道这种情况的时候,因为题目是要所有的字符串都拥有的前缀,那么此时这个小于strs[0]字符串长度的字符串,就是我们需要的那个字符串
我们以输入strs = ["flower","flow","flight"]转进行自制动画演示
点击这里在B站看动画演示喔,喜欢的看官可以点点关注,谢谢
废话不多说,直接上代码,为了让各位看官更能清晰理解,我的代码写得不精简,我的代码里加了大量的注释,相信各位看官可以理解,如果我有些没写清楚或者写错的,可以评论区或者私信我喔
public String longestCommonPrefix(String[] strs) {
//对strs做判断
if(strs == null || strs.length == 0) return "";
//数组中的第一个字符串,取出它的长度
int firstLength = strs[0].length();
//整个数组的长度
int strsLength = strs.length;
for(int i = 0; i < firstLength; i++){
//取出第一个字符串的第i个字符
char c = strs[0].charAt(i);
//依次对每一个字符串的第i个字符进行比较
for(int j = 1; j < strsLength; j++){
//一旦i等于某个字符串的长度,说明这个字符串应该是公共部分
//例如"abc","ab","abdc"
//肉眼可以看出,ab是最长公共前缀,也就是说当程序循环到"abc"中的c的时候
//发现"ab"的长度等于当前循环的次数,2=2,所以就返回这个"ab"
//或者两个字符不相等
if(i == strs[j].length() || strs[j].charAt(i) != c){
//substring方法是String类自带的方法,它的作用是截取一个字符串,
//变成一新的字符串
//而且传进入的参数是左闭右开,[)
//也就是程序的[0,i),包括0,不包括i
return strs[0].substring(0,i);
}
}
}
return strs[0];
}
来源:oschina
链接:https://my.oschina.net/u/4269898/blog/4944613