题目:最长公共前缀
难度:EASY
题目内容:
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string ""
.
翻译:编写一个函数,在字符串数组中查找最长公共前缀字符串。
如果没有公共前缀,则返回空字符串。
Example 1:
Input: ["flower","flow","flight"]
Output: "fl"
Example 2:
Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.
Note:
所有输入都是小写字母a-z。
我的思路:最简单的方法对String[]中最短的那一个长度进行遍历,在遍历中取String[]中每一个的当前位置字符与下一个比较,一旦不一样就返回结果。
还有一种就是,用Set,在内部遍历中用set将String[]中每一个的当前位置字符放入,出来的时候判断size()是否==1,好吧这种空间复杂度更高,显得更蠢。。
1 public String longestCommonPrefix(String[] strs) {
2 if (strs.length < 1) {
3 return "";
4 }
5
6 int minlen = Integer.MAX_VALUE;
7 for (int i = 0;i < strs.length; i++) {
8 if (strs[i].length() < minlen) {
9 minlen = strs[i].length();
10 }
11 } // 获得最短长度minLen
12
13
14 StringBuffer sb = new StringBuffer();
15 for (int j = 0; j < minlen; j++) {
16 for (int i = 0; i< strs.length - 1; i++) {
17 if (strs[i].charAt(j) != strs[i+1].charAt(j)) {
18 return sb.toString();
19 }
20 }
21 sb.append(strs[0].charAt(j));
22 }
23 return sb.toString();
24 }
我的时间复杂度: O(N*M) N为字符串个数,M最短字符串长度
编码过程问题:
1、一开始直接拿strs[0]的长度做的循环,导致测试用例{aa,a}越界,写了minLen后通过
2、minLen的初值一开始写成了MIN_VALUE.
参考答案Code:
1 public String longestCommonPrefix(String[] strs) {
2 if (strs == null || strs.length == 0)
3 return "";
4 String pre = strs[0];
5 for (int i = 1; i < strs.length; i++)
6 while (strs[i].indexOf(pre) != 0)
7 pre = pre.substring(0, pre.length()-1);
8 return pre;
9 }
9行! 厉害了,。。
答案复杂度:O(N*M) 虽然复杂度看起来一样,但是其实每次while循环并没有循环M次,也少了取minLen的操作
答案思路:取任意一个字符串做初始前缀,然后对后面每一个进行while循环:如果当前的前缀 与你进行字符串匹配的结果不是0【是0则是前缀,null,和其他字符都不行】,则把pre的最后一个字符去掉,再匹配,直到为0.
由于是取大家最长的公共前缀,所以也就类似于木桶短板效应,最后的值会是那个最短的,所以把pre保存给下一个再进行while循环。
来源:oschina
链接:https://my.oschina.net/u/4332587/blog/3999925