NO.14 最长公共前缀 简单
思路一:依次LCP法假设输入数组为[“leetcode”,”leetcodes”,”leetgo”,”letsgo”]:1. 我们先让0号元素和1号元素求公共前缀 LCP(0号元素,1号元素)求出最长公共前缀prefix=”leetcode”。2. 然后prefix=LCP[prefix,2号元素]求出prefix=leet。3. prefix=LCP[prefix,3号元素]求出prefix=le。求出最终的答案”le”。
1 | public String longestCommonPrefix(String[] strs) { |
时间复杂度:O(s) s是数组中每个字符串的字符个数之和
空间复杂度:O(1)
思路二:优化依次LCP法 上述方法中,无论数组每个元素的长短我们都需要从第一个数组元素比较到最后一个数组元素,所以有一个明显的问题:如果数组中最后一个元素非常短,但是我们仍然需要比较s次。
可以将思路一的算法改为从前往后枚举字符串的每一列,先比较每个字符串相同列上的字符(即不同字符串相同下标的字符)然后再进行对下一列的比较。
依然假设输入数组为[“leetcode”,”leetcodes”,”leetgo”,”letsgo”]:1. 第一次循环i=0先用0号元素的第一个字符”l”,去和1号元素的第一个字符比较,相等;继续去和第2号元素的第一个字符比较,相等;继续去和第3号元素的第一个字符比较,相等;2. 第二次循环i=1再用0号元素的第二个字符”e”,去和1号元素的第二个字符比较,相等;继续去和第2号元素的第二个字符比较,相等;继续去和第3号元素的第二个字符比较,相等;3. 第三次循环i=2再用0号元素的第三个字符”e”,去和1号元素的第三个字符比较,相等;继续去和第2号元素的第三个字符比较,相等;继续去和第3号元素的第三个字符比较,不相等,则返回数组0号元素[0,i)字符,即”le”。
1 | public String longestCommonPrefix(String[] strs) { |
时间复杂度:O(s) s是数组中每个字符串的字符个数之和。在最坏情况下,本算法的效率与算法一相同,但是最好的情况下,算法只需要进行 n*minLen 次比较,其中minLen是数组中最短字符串的长度。
空间复杂度:O(1)
思路三:分治法 其实这方法也是上述的依次LCP法的一种优化方法,LCP(s1,s2,…,sn)=LCP(LCP(s1,s2,…,smid),LCP(smid+1,smid+2,…sn))。
先将数组元素分成两部分,分别求LCP得到lcpLeft和lcpRight,最后求LCP(lcpLeft,lcpRight)得到prefix。
1 | public String longestCommonPrefix(String[] strs) { |
时间复杂度:O(S),S是所有字符串中字符数量的总和,S=m∗n。
空间复杂度:O(m*log(n))
本人菜鸟,有错误请告知,感激不尽!