Write a function to find the longest common prefix string amongst an array of strings.
找出所有字符串数组中的公共前缀。
一、我的第一想法是,拿第一个字符串作为基准,取它的每一位和剩余所有字符串的相对应的位数相比较,如果相同存储这位的字符,并继续向后移动,一旦出现某个字符串的当前位和第一个字符串当前位的内容不相同,停止后移。那么,第一个字符串从开始到这个位置(不包括)为止,就是所求。
我的代码如下:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0)
return "";
StringBuffer result = new StringBuffer("");
String first = strs[0];
int len = strs.length;
for(int i=0;i<first.length();i++){
char c = first.charAt(i);
int j;
for(j=1;j<len;j++){
if(strs[j].length() == i || strs[j].charAt(i) != c){
break;
}
}
if(j == len)
result.append(c);
else
break;
}
return result.toString();
}
}
有几点需要注意:
- 返回值不能是null,而应该是“”(空字符串),判断的时候也应该按照字符串的长度是否为0,而不能判断strs == null。这很重要!
- 还要注意,可能后面字符串的位数要小于第一位的位数,即第二个for循环中的if判断条件。
- 这里使用了StringBuffer来拼接字符串!
二、除此之外,还有一些方法。比如说:
1、所求的最长公共前缀子串一定是每个字符串的前缀子串。所以随便选择一个字符串作为标准,把它的前缀串,与其他所有字符串进行判断,看是否是它们所有人的前缀子串。这里的时间性能是O(m*n*m)。
这是通过别人博客看到的,不是说这个方法好,而是说通过这个方法可以学到这么一个:怎么得到一个字符串的前缀(只需要截取字符串的substring函数的前i为即可),以及如何判断这个前缀是不是另一个字符串的前缀(同时移动指针即可)。
2、字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
这道题可以用到Trie树,这个我还没有学习,而且还和哈希有着一定的关系,所以先列出这个,之后会和哈希一块进行学习。具体代码参考下面的网址就好!
注:等做完字符串的最长公共子序列、子串等等相关的问题,再重新总结一遍!
参考:
http://blog.youkuaiyun.com/ojshilu/article/details/12882835
https://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html