Leetcode14-最长公共前缀
虽然只是一道简单题,但是看了官方的题解还是有所收获,在此记录一下。
自己写的解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) return ""; String result = strs[0]; for (String str : strs) { if (str.length() == 0) return ""; for (int i = 0; i < Math.min(str.length(), result.length()); i++) { if (i == str.length() - 1 && str.charAt(i) == result.charAt(i)) { result = result.substring(0, i + 1); break; } if (str.charAt(i) != result.charAt(i)) { result = result.substring(0, i); break; } } } return result; }
|
看官方解法的收获
一、String.indexof(String s)的使用
虽然我的解题思路和官方的解题思路1一致,但是在代码简洁性上来讲还是有所不如,下面是官方解法:
1 2 3 4 5 6 7 8 9 10
| 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; }
|
这段代码的精妙之处就在于使用了indexOf来判断当前最大前缀的结果在最新的字符串str中的匹配结果,如果存在,就会返回prefix的首个字符在最新字符串str所对应的下标,如果没有匹配就会返回-1。例如:
1 2 3 4 5 6
| String a1 = "ha"; System.out.println(a1.indexOf("hah")); String a2 = "hahahaheiheihei"; System.out.println(a2.indexOf("hah")); String a3 = "hahahaheiheihei"; System.out.println(a3.indexOf("hahei"));
|
就拿a3的例子来说,如果结果不是0,那么就会执行substring,去掉最后一个字母,再进行匹配,直到找出对应结果为0的字符串,这时如果没有公共前缀的话,prefix就会变为空字符串,后面就没必要进行判断了,可以加一个判断,直接返回。
二、分治的使用
思想较为简单,代码也比较固定,总的来说就是分别两两比较字符串再进行合并比较,(这里的比较的意思就是找出公共最长前缀并返回,作为新的比较字符串)直接贴代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) return ""; return longestCommonPrefix(strs, 0 , strs.length - 1); }
private String longestCommonPrefix(String[] strs, int l, int r) { if (l == r) { return strs[l]; } else { int mid = (l + r)/2; String lcpLeft = longestCommonPrefix(strs, l , mid); String lcpRight = longestCommonPrefix(strs, mid + 1,r); return commonPrefix(lcpLeft, lcpRight); } }
String commonPrefix(String left,String right) { int min = Math.min(left.length(), right.length()); for (int i = 0; i < min; i++) { if ( left.charAt(i) != right.charAt(i) ) return left.substring(0, i); } return left.substring(0, min); }
|