最长公共前缀 leetcode 14

方法一(纵向扫描)

解题思路

先计算出数组中最小的字符串长度,这样就避免了越界的情况,思路更加明确,但同时时间复杂度就相应的上升了。

先计算所有字符串在同一列上的字符是否相同,然后依次向后延伸。

代码及注释

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        //如果数组中没有字符串,则直接返回空字符串
        if(strs.size()==0) return "";
        //结果字符串
        string ans = "";
        int n = strs[0].size();
        for(int i=1;i<strs.size();i++){
            if(strs[i].size()<n){
                n=strs[i].size();
            }
        }
        //利用前一个和后一个字符串所对应的字符是否相等判断是否具有公共前缀
        //没有则直接退出返回当前ans
        int flag = 0;
        for(int i=0;i<n;i++){
            for(int j=0;j<strs.size()-1;j++){
                if(strs[j][i]!=strs[j+1][i]){
                    flag = 1;
                    break;
                }
            }
            if(flag==1){
                return ans;
            }
            ans+=strs[0][i];
        }
        return ans;

    }
};

方法二(水平扫描法)

思路

将第一个字符作为ans,然后不断和后面的字符串进行计算他们的公共前缀然后更新,最后的结果即为最长公共前缀

代码及注释

class Solution {
public:
    //返回两个字符串的公共前缀
    string CommonPrefix(string a,string b){
        int i=0,j=0;
        string t = "";
        while(i<a.size()&&j<b.size()&&a[i]==b[j]){
            t+=a[i];
            i++;
            j++;
        }
        return t;
    }
    string longestCommonPrefix(vector<string>& strs) {
        //数组长度为0返回空字符串
        if(strs.size()==0) return "";
        //数组长度为1返回第一个字符串
        if(strs.size()==1) return strs[0];
        //将第一个字符串作为ans,不断与后面的字符串计算公共前缀然后更新ans,如果ans为空则直接返回ans;
        string ans = strs[0];
        for(int i=1;i<strs.size();i++){
            ans = CommonPrefix(ans,strs[i]);
            if(ans=="") return ans;
        }
        return ans;
    }
};

方法三(分治法)

思路

代码及注释

class Solution {
public:
    //返回两个字符串的公共前缀
    //也是分治法的合
    string merge(string a,string b){
        int i=0,j=0;
        string t = "";
        while(i<a.size()&&j<b.size()&&a[i]==b[j]){
            t+=a[i];
            i++;
            j++;
        }
        return t;
    }
    //分治法的分
    string divide(vector<string>& strs,int left,int right){
        //当分到最后只有一个字符串时直接返回,因为一个字符串的公共前缀就是他的本身
        if(left==right){
            return strs[left];
        }else{
            //将数组一分为二
            int mid = (left+right)/2;
            string leftString = divide(strs,left,mid);
            string rightString = divide(strs,mid+1,right);
            //再通过合并各个分组的公共前缀
            return merge(leftString,rightString);
        }
    }
    string longestCommonPrefix(vector<string>& strs) {
        //数组长度为0返回空字符串
        if(strs.size()==0) return "";
        //数组长度为1返回第一个字符串
        if(strs.size()==1) return strs[0];

        //利用分治法计算
        return divide(strs,0,strs.size()-1);
    }
};

原文地址:https://www.cnblogs.com/moumangtai/p/12129664.html

时间: 2024-08-29 00:00:21

最长公共前缀 leetcode 14的相关文章

LeetCode:最长公共前缀【14】

LeetCode:最长公共前缀[14] 题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存

LeetCode 14. 最长公共前缀(Longest Common Prefix)

14. 最长公共前缀 14. Longest Common Prefix 题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". LeetCode14. Longest Common Prefix 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racec

LeetCode第14题 最长公共前缀

/* 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". ["flower","flow","flight"] */ 思路1:时间复杂度为O(n*m),遍历数组 ,相同元素放入Stringbuilder中. 1 class Solution14 { 2 3 public String longestCommonPrefix(String[] strs) { 4 if (strs.lengt

python(leetcode)-14最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀. 说明: 所有输入只包含小写字母 a-

# Leetcode 14:Longest Common Prefix 最长公共前缀

公众号:爱写bug Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "". 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". Example 1: Input: ["flower"

力扣(LeetCode) 14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀. 说明: 所有输入只包含小写字母 a-

【leetcode算法-简单】14. 最长公共前缀

[题目描述] 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"]输出: "fl" 示例 2: 输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀.说明: 所有输入只包含小写字母

leetcode——Longest Common Prefix 最长公共前缀(AC)

Write a function to find the longest common prefix string amongst an array of strings. 其实做起来会感觉很简单,需要注意的是要考虑效率的问题,毕竟可能是很长的字符串数组,所以可以考虑选取所有字符串中最短的那个来首先进行比较,因为最长公共子串肯定不会大于其长度,这样避免了字符串之间长度差异很大造成的效率损失,然后每次比较之后最长公共子串的长度也永远不会大于最短的那个字符串,只会不变或减小,只要遍历字符串数组,挨个

LeetCode Longest Common Prefix 最长公共前缀

题意:给多个字符串,返回这些字符串的最长公共前缀. 思路:直接逐个统计同一个位置上的字符有多少种,如果只有1种,那么就是该位是相同的,进入下一位比较.否则终止比较,返回前缀.可能有一个字符串会比较短,所以前缀最长也只是最短字符串的长度. 1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 string ans=""; 5 if(strs.empty()