这道题要求给你一组字符串数组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 }