zoukankan      html  css  js  c++  java
  • 【LeetCode-字符串】最长公共前缀

    题目描述

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

    输入: ["flower","flow","flight"]
    输出: "fl"
    
    输入: ["dog","racecar","car"]
    输出: ""
    解释: 输入不存在公共前缀。
    

    题目链接: https://leetcode-cn.com/problems/longest-common-prefix/

    思路1

    首先找到最短的字符串,然后遍历最短的字符串,将当前位和其余字符串作比较:如果其余字符串的当前位和最短字符串的当前位全部相等,则比较下一位;如果有一个不相等,则循环终止,从字符串开始位置到当前位置的前一位就是最长的公共前缀(其实不需要根据最短字符串进行比较,随便找一个字符串作为基准比较就行了)。代码如下:

    class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
            if(strs.empty()) return "";
    
            int shortest = 0x7fffffff;
            string shortestStr = "";
            for(int i=0; i<strs.size(); i++){
                if(strs[i].length()<shortest){
                    shortest = strs[i].length();
                    shortestStr = strs[i];
                }
            }
    
            int i=0;
            while(i<shortest){
                bool breakFlag = false;
                for(int j=0; j<strs.size(); j++){
                    if(strs[j][i]!=shortestStr[i]){
                        breakFlag = true;
                        break;
                    }
                }
                if(breakFlag) break;
                i++;
            }
            return shortestStr.substr(0,i);
        }
    };
    
    • 时间复杂度:O(n)
      n是字符串数组的长度。最坏情况下为O(n*m),其中m是最短字符串的长度。
    • 空间复杂度:O(1)

    思路2

    首先选择一个字符串当做目前的前缀,不妨选第一个,然后判断目前的前缀是否是第二个字符串的前缀:如果不是,则将当前的前缀最后一个字符去掉,如果去掉后当前前缀为空,则直接返回;如果去掉后不为空且是第二个字符串的前缀;那么继续通过同样的方法比较第三个字符串,直至比较一遍或者前缀为空,如果比较结束后,当前前缀不为空,则当前前缀就是最长的公共前缀。代码如下:

    class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
            if(strs.empty()) return "";
    
            string prefix = strs[0];
            for(int i=1; i<strs.size(); i++){
                while(strs[i].find(prefix)!=0){    // prefix不是strs[i]的前缀
                    prefix.pop_back(); // 删除prefix的最后一个字符
                    if(prefix.empty()) return prefix;
                }
            }
            return prefix;
        }
    };
    
    • 时间复杂度:O(n)
      n为字符串数组的长度。
    • 空间复杂度:O(1)
  • 相关阅读:
    redis 篇
    redis 篇
    Url 简单讲解
    django 分组统计遇见的问题
    Django REST framework 自定义字段
    python 之 MRO 异常
    redis中的事务、lua脚本和管道的使用场景
    不实例化一个 class 的时候使用它的property
    转载牛人的英语学习方法,值得学习
    2017年值得学习的3个CSS特性
  • 原文地址:https://www.cnblogs.com/flix/p/12686641.html
Copyright © 2011-2022 走看看