题目
题目来源:力扣(LeetCode)
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,”flow”,”flight”]
输出:”fl”
示例 2:
输入:strs = [“dog”,”racecar”,”car”]
输出:””
思路分析
纵向扫描
纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。
代码实现
/*** @param {string[]} strs* @return {string}*/// 1. 纵向扫描// 时间复杂度:O(mn) m 表示字符串数组中所有字符串的平均长度,n 表示字符串数组的大小// 空间复杂度:O(1)var longestCommonPrefix = function (strs) {if (strs.length == 0) return "";const rows = strs.length;const cols = strs[0].length;// 先遍历 列,列就是每个字符for (let i = 0; i < cols; i++) {const firstChar = strs[0][i];// 再遍历行,行就是每一个字符串for (let j = 1; j < rows; j++) {if (strs[j].length == i || strs[j][i] != firstChar) {return strs[0].substr(0, i);}}}return strs[0];};
横向扫描
依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。
代码实现
// 2. 横向扫描// 时间复杂度:O(mn) m 表示字符串数组中所有字符串的平均长度,n 表示字符串数组的大小// 空间复杂度:O(1)var longestCommonPrefix2 = function (strs) {if (strs.length == 0) return "";let prefix = strs[0]// 依次遍历每个字符串for (let i = 1; i < strs.length; i++) {// 比较两个字符串中的字符是否相等prefix = longestCommonPrefixHelp(prefix, strs[i])if (prefix.length == 0) return ""}return prefix};var longestCommonPrefixHelp = function (str1, str2) {const len = Math.min(str1.length, str2.length)let index = 0while (index < len && str1[index] == str2[index]) {index++}return str1.substr(0, index)}
参考阅读 https://leetcode-cn.com/problems/longest-common-prefix/solution/jian-dan-yi-dong-javac-pythonjs-zui-chan-jt6w/ https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode-solution/ https://leetcode-cn.com/problems/longest-common-prefix/solution/tu-jie-leetcodezui-chang-gong-gong-qian-zhui-lcp-b/
