美文网首页
最长公共前缀

最长公共前缀

作者: hbhey | 来源:发表于2020-04-16 16:52 被阅读0次

    题目描述

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

    • 示例 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];
        }
    }
    

    相关文章

      网友评论

          本文标题: 最长公共前缀

          本文链接:https://www.haomeiwen.com/subject/fvkdvhtx.html