【嘎】字符串-最长公共前缀
题目:编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
又是很慢的写法 :(
1 class Solution { 2 public String longestCommonPrefix(String[] strs) { 3 // 一开始没有判断 4 if (strs == null || strs.length < 1) { 5 return ""; 6 } 7 if (strs.length == 1) { 8 return strs[0]; 9 } 10 boolean hasFlag = false; 11 String initstr = strs[0]; 12 for (int i = 1; i < strs.length; i++) { 13 String str1 = initstr; 14 String str2 = strs[i]; 15 String temp = ""; // 这里不能去掉,每次循环的时候都要重新归零 16 int len = str1.length() > str2.length()? str2.length():str1.length(); 17 // substring不包含第二个参数,一开始这里没有考虑到 18 for (int j = 1; j <= len; j++) { 19 if (str1.substring(0, j).equals(str2.substring(0,j))) { 20 hasFlag = true; 21 temp = str1.substring(0, j); 22 } 23 } 24 initstr = temp; 25 // 有相同的 26 if (hasFlag) { 27 28 } else { 29 return ""; 30 } 31 } 32 return initstr; 33 } 34 }
本来想优化优化代码,然后越写越糟糕。。。后来发现写的每一步都减不了。。然后还是看看大佬的解答
果然,我们不一样。。。突然想起当时看到题目想到了indexOf,然后就忘了
官方:
方法一:水平扫描法
就是利用indexOf,将第一个作为prefix,然后当遍历1之后每个不是以他为头的就将prefix减少一位
public String longestCommonPrefix(String[] strs) { if (strs.length == 0) return ""; String prefix = strs[0]; for (int i = 1; i < strs.length; i++) while (strs[i].indexOf(prefix) != 0) { prefix = prefix.substring(0, prefix.length() - 1); if (prefix.isEmpty()) return ""; } return prefix; }
看了这个代码,我发现我原先的7-9行是不需要的,在执行时间上没啥区别,但是也是冗余了~~
官方还有其他几种解法,下面是一位受官方启发写出来的
public String longestCommonPrefix2(String[] strs) { if (strs.length == 0) { return ""; } String ans = strs[0]; for (int i = 1; i < strs.length; i++) { int j = 0;// 妙米生花!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! for (; j < strs[i].length() && j < ans.length(); j++) { if (ans.charAt(j) != strs[i].charAt(j)) { break; } } ans = ans.substring(0, j); if (ans.equals("")) { return ans; } } return ans; }
越努力越幸运~ 加油ヾ(◍°∇°◍)ノ゙