编写一个函数来查找字符串数组中的最长公共前缀。

    如果不存在公共前缀,返回空字符串 “”。

    示例 1:

    输入: [“flower”,”flow”,”flight”]
    输出: “fl”
    示例 2:

    输入: [“dog”,”racecar”,”car”]
    输出: “”
    解释: 输入不存在公共前缀。
    说明:

    所有输入只包含小写字母 a-z 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-common-prefix

    思路:
    暴力:枚举所有字符串的每一列,比较相同列上的字符是否相等,如果相同继续下一列比较
    分治:获取[left,mid]LCP1[mid+1,right]LCP2。对LCP1LCP2LCP
    复杂度分析:
    暴力:时间复杂度O(mn) m为字符串平均长度,n为strs数组长度。空间复杂度O(1) 无需额外空间。
    分治:时间复杂度O(mn),m为字符串平均长度,n为strs数组长度。时间复杂度的递推式为T(n) = 2*T(n/2)+O(m),由主定理可算得T(n) =O(mn)。空间复杂度:O(mlogn),递归调用层数最大为logn,每层需要m的空间存储返回结果。

    1. //暴力
    2. var longestCommonPrefix = function (strs) {
    3. let n = strs.length;
    4. if (n === 0) return "";
    5. let m = strs[0].length;
    6. for (let i = 0; i < m; i++) {
    7. for (let j = 1; j < n; j++) {
    8. let c = strs[0].charAt(i);
    9. if (i === strs[j].length || strs[j].charAt(i) !== c) {
    10. return strs[0].substring(0, i);
    11. }
    12. }
    13. }
    14. return strs[0];
    15. };
    16. //分治
    17. var longestCommonPrefix = function (strs) {
    18. const myLongestCommonPrefix = (strs, start, end) => {
    19. if (start === end) {
    20. return strs[start];
    21. } else {
    22. let mid = (start + end) >> 1;
    23. let left = myLongestCommonPrefix(strs, start, mid);
    24. let right = myLongestCommonPrefix(strs, mid + 1, end);
    25. return commonPrefix(left, right);
    26. }
    27. };
    28. const commonPrefix = (leftStr, rightStr) => {
    29. let minLength = Math.min(leftStr.length, rightStr.length);
    30. for (let i = 0; i < minLength; i++) {
    31. if (leftStr[i] !== rightStr[i]) {
    32. return leftStr.substr(0, i);
    33. }
    34. }
    35. return leftStr.substr(0, minLength);
    36. };
    37. if (strs === null || strs.length === 0) {
    38. return "";
    39. } else {
    40. return myLongestCommonPrefix(strs, 0, strs.length - 1);
    41. }
    42. };