Leetcode(14) - Longest Common Prefix

  这道题要求给你一组字符串数组strs[],找到整个数组的所有字符串里最长的前缀,如(["abc","abde,"abcad"],最长的前缀是"ab"])。

  这题比较简单,思路是这样子:一开始,把strs[0]当成是最长的前缀prefix,然后从strs[1]开始遍历,找到strs[0]和strs[1]前面公共部分,更新prefix,然后继续遍历,直到整个数组遍历完毕或者prefix的长度为0为止。

  找公共部分可以利用Java里s1.indexOf(s2)方法,如果s2是s1的子字符串,则会返回s2在s1里第一次出现的位置(不是子字符串返回-1),所以如果要判断s2是不是s1的前缀,只要看s1.indexOf(s2)返回是不是0就好,如果不是,则s2上截掉最后一个字符,继续匹配,直到匹配到为0为止。

  因为String是不可以截掉字符的,所以我生成StringBuilder对象来代表prefix而不是String,这样就可以利用StringBuilder里的prefix.deleteCharAt(index)的方法来删除字符了。

  代码如下:

 1 public class Solution {
 2     public String longestCommonPrefix(String[] strs) {
 3         if (strs.length == 0) return "";
 4         StringBuilder sb = new StringBuilder(strs[0]);
 5         for (int i = 1; i < strs.length;i++) {
 6             while (sb.length() > 0 && (strs[i].indexOf(sb.toString()) != 0)) {
 7                 sb.deleteCharAt(sb.length() - 1);
 8             }
 9             if (sb.length() == 0) break;
10         }
11         return sb.toString();
12     }
13 }

  有人可能要问,如果不用indexOf方法可不可以做,当然可以。你需要做的就是在每一个循环里,从头开始一个一个字符匹配prefix和待验字符串,然后纪录相同字符长度,最后把prefix从第一个不相同的字符出现的位置开始删掉。删掉的工作仍然是由StringBuilder来完成。

  代码如下:

 1 //思路:运用StringBuilder来一一比对。
 2 public class Solution {
 3     public String longestCommonPrefix(String[] strs) {
 4             int length = strs.length;
 5             if (length == 0) return "";
 6             StringBuilder prefix = new StringBuilder();
 7             prefix.append(strs[0]);
 8             for (int i = 1; i < length; i++) {
 9                 int strLength = strs[i].length();
10                 int prefixLength = prefix.length();
11              //待比较的长度取决于prefix的长度和待验字符串的长度的较小者
12                 int compareLength = prefixLength <= strLength? prefixLength : strLength;
13                 int j;
14                 for (j = 0; j < compareLength; j++) {
15                 //找到第一个不相同的就break;
16                     if (prefix.charAt(j) != strs[i].charAt(j)) {
17                         break;
18                     }
19                 }
20             //删掉所有j和prefixLength-1之前的字符。
21                 prefix.delete(j,prefixLength);
22                 if (prefix.length() == 0) break;
23             }
24             return prefix.toString();
25     }
26 }
原文地址:https://www.cnblogs.com/kepuCS/p/5244061.html