14. 最长公共前缀

方法一、横向比较

思路

最长公共前缀一定是数组元素都具有的,默认当前最长公共前缀为第一个元素值,进行遍历,拿第一个、第二个……分别与当前最长公共前缀比较,逐步最小最长公共前缀的范围,最终确定最长公共前缀。

复杂度

时间复杂度:O(nm)

n 元素个数,m平均每个元素的字符长度。

空间复杂度:O(1)

代码

class Solution {

    /**
     * @param String[] $strs
     * @return String
     */
    function longestCommonPrefix($strs) {
        // 当前最大前缀
        $prefix = '';
        for($i = 0, $prefix = $strs[0] ? : ''; $i < count($strs); $i++) {
            for($j = 0; $j < strlen($prefix); $j++) {
                if($prefix[$j] != $strs[$i][$j]) {
                    $prefix = substr($prefix, 0, $j);
                    break;
                }
            }
        }

        return $prefix;
    }
}

方法二、纵向比较

思路

判断每个元素中的第一个字符是否相同,第二个字符是否相同……当有不相同或者有元素字符遍历完毕,则结束。

复杂度

时间复杂度:O(nm)

n 元素个数,m平均每个元素的字符长度。

空间复杂度:O(1)

代码

class Solution {

    /**
     * @param String[] $strs
     * @return String
     */
    function longestCommonPrefix($strs) {

        if(empty($strs)) return '';

        // 元素的最小长度
        $mixLen = PHP_INT_MAX;
        for($i = 0; $i < count($strs); $i++) {
            if(strlen($strs[$i]) < $mixLen) {
                $mixLen = strlen($strs[$i]);
            }
        }

        // 当前最大前缀
        $prefix = '';
        $i = 0;

        while($i < $mixLen) {
            $curStr = $strs[0][$i];
            for($j = 0; $j < count($strs); $j++) {
                if($strs[$j][$i] != $curStr) {
                    break 2;
                }
            }

            $prefix .= $curStr ? : '';
            $i++;
        }

        return $prefix;
    }
}

results matching ""

    No results matching ""