<LeetCode>最长公共前缀

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。

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

  • 示例 2:
    输入: [“dog”,“racecar”,“car”]<
    输出: “”
    解释: 输入不存在公共前缀。

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

解析

垂直扫描法

水平扫描法

  1. 取出第一个字符串暂时作为最长公共前缀(prefixStr);
  2. 依次遍历字符串数组中的其他字符串,分别与prefixStr比较;
  3. 若当前字符不包含prefixStr,则对prefixStr进行裁取(长度减一),再次与当前字符进行比较;
  4. 若当前字符包含prefixStr,则取出字符串数组的下一个字符串与prefixStr进行比较;

代码实现

  • 时间复杂度:O(S),S是所有字符串中字符数量的总和,最坏情况时n个字符串全部相同,则indexOf要比较S次字符比较
  • 空间复杂度:O(1)
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0) return "";
String prefixStr = strs[0];
for(int i = 1; i < strs.length; i++){
while(strs[i].indexOf(prefixStr) != 0){
prefixStr = prefixStr.substring(0,prefixStr.length() - 1);
if(prefixStr.isEmpty()) return "";
}
}
return prefixStr;
}
}

水平扫描法

  1. 取出字符串数组中的第一个字符串,遍历该字符串中的字符,依次与数组中的其他字符串的同列字符比较;
  2. 若出现不同的字符,则对第一个字符串进行相应位置截取,便得最长公共前缀;
  3. 若某字符串长度等于当前所比较字符位置(i = strs[j].length()),则也进行第2步的截取操作;

代码实现

  • 时间复杂度: O(S),S 是所有字符串中字符数量的总和
  • 空间复杂度: O(1)
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0) return "";
for(int i = 0; i < strs[0].length(); i++){
char a = strs[0].charAt(i);
for(int j = 1; j < strs.length; j++){
if( i == strs[j].length() || a != strs[j].charAt(i)){ // 先执行||, 然后执行后面, 且i == strs[j].length()表示存在字符串已经遍历完
return strs[0].substring(0,i);
}
}
}
return strs[0];
}
}
Author: HB
Link: http://www.huangbin.fun/LeetCode-最长公共前缀.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.