No.014:Longest Common Prefix

问题:

Write a function to find the longest common prefix string amongst an array of strings.

 

官方难度:

Easy

 

翻译:

寻找一个字符串数组的最长公共前缀。

 

方法一:

  1. 数组长度为0,返回空字符串。
  2. 将数组第一项,作为初始的公共前缀。
  3. 从数组第二项开始进入循换,整理当前字符和当前前缀字符的长度。
  4. 以小长度的字符串为基准,从头开始逐个匹配,遇到不同的字符时,更新前缀字符。
  5. 为防止完全匹配情况,如“aa”匹配“aaa”。由于不存在不同的字符,所以不会更新的情况,设定更新标志位flag,当flag为false时,将前缀字符更新为小长度字符。
  6. 在内循环结束之后,若得到的前缀字符长度为0,直接跳出整个循环。
  7. 外循环可以使用foreach循环。

 

方法一的解题代码:

 1     private static String method(String[] strs) {
 2         String prefix = strs.length == 0 ? "" : strs[0];
 3         // 从数组第二项开始遍历
 4         for (String compare : strs) {
 5             // 整理长度
 6             String s1 = prefix.length() > compare.length() ? compare : prefix;
 7             String s2 = prefix.length() > compare.length() ? prefix : compare;
 8             boolean flag = false;
 9             for (int j = 0; j < s1.length(); j++) {
10                 if (s1.charAt(j) != s2.charAt(j)) {
11                     prefix = prefix.substring(0, j);
12                     flag = true;
13                     break;
14                 }
15             }
16             // 防止完全匹配的情况
17             if (!flag) {
18                 prefix = s1;
19             }
20             if (prefix.length() == 0) {
21                 break;
22             }
23         }
24         return prefix;
25     }
method

 

方法二:

  1. 其实,String类自带了String.startWith()的实例方法,来判断一个字符串是否以另一个字符串为开头的形式。使用这种方法可以进一步地增强效率。
  2. 在内循环中,判断当前字符是否匹配当前前缀,若不是消去前缀字符串的最后一个字符,直到匹配成功。
  3. 注意入参检查。

 

方法二的解题代码:

 1     public static String longestCommonPrefix(String[] strs) {
 2         if (strs == null) {
 3             throw new IllegalArgumentException("Input error");
 4         }
 5         String prefix = strs.length == 0 ? "" : strs[0];
 6         for (String compare : strs) {
 7             while (!compare.startsWith(prefix)) {
 8                 // 不匹配,消去前缀最后一项
 9                 prefix = prefix.substring(0, prefix.length() - 1);
10             }
11             if (prefix.length() == 0) {
12                 break;
13             }
14         }
15         return prefix;
16     }
longestCommonPrefix

 

相关链接:

https://leetcode.com/problems/longest-common-prefix/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q014.java

 

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

 

posted @ 2016-10-12 09:51  Gerrard_Feng  阅读(266)  评论(0编辑  收藏  举报