leetcode 14: 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
-
1 <= strs.length <= 200
-
0 <= strs[i].length <= 200
-
strs[i]
仅由小写英文字母组成
Related Topics
字符串
思路1:
遍历每一列字符对比,但是不知道有多少行。实际上可以使用while(true)死循环,当符合不是前缀的条件时,可以直接break退出。
需要注意的是,在进行比较字符前,需要判断字符是否存在,也就是用index和字符串的length做比较。 如果不存在,那么就不需要再判断前缀了。
public String longestCommonPrefix(String[] strs) { StringBuilder sb = new StringBuilder(); int index = 0; //遍历每一列字符 由于不知道有一行字符串长度 使用true循环 boolean flag = true; while(flag){ // 字符不存在 就不需要判断了 if(index>=strs[0].length()){ break; } //开始往后比较 for(int i = 1; i < strs.length;i++){ //先判断字符是否存在 //存在的话 不相等 说明不是前缀 if(strs[i].length()<= index || strs[i].charAt(index) != strs[i-1].charAt(index)){ flag = false; //不是前缀 可以退出while循环 break;//退出for循环 } } //flag == false 说明不是前缀 退出while循环 if(flag == false){ break; } //都相等 说明是前缀 sb.append(strs[0].charAt(index)); index++; } return sb.toString(); } 解答成功: 执行耗时:1 ms,击败了69.00% 的Java用户 内存消耗:39.3 MB,击败了5.00% 的Java用户
思路1改进:
参考leetcode官方解答,可以以第一行的长度为标准,时间复杂度都一样,就是代码看起来简洁了很多。
public String longestCommonPrefix(String[] strs) { // 以第一行的字符串长度为标准 for(int i = 0 ; i < strs[0].length();i++){ char c = strs[0].charAt(i); //跟剩下的字符串比较第i列的字符 for(int j = 1; j < strs.length;j++){ //第j列字符长度不够 或者 字符不等于c 前缀计算完毕 if(i == strs[j].length() || strs[j].charAt(i) != c){ return strs[0].substring(0,i); } } } //如果 全部比完 则strs[0]就是前缀 return strs[0]; } 解答成功: 执行耗时:1 ms,击败了69.00% 的Java用户 内存消耗:39.4 MB,击败了5.00% 的Java用户