leetcode_字节跳动_挑战字符串_最长公共前缀

Posted dragonsbug

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode_字节跳动_挑战字符串_最长公共前缀相关的知识,希望对你有一定的参考价值。

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

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

说明:

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

 

发现不知道手感和思路不够了还是什么,做题时总是漏掉一些重要的信息。

1. ["aa","a"],返回的是最小串a。

2.[ ] 无字符串数组返回“”。

 

思路:

1.遍历每一个字符串获得最小长度minlen,minlen就是最大可能符合的公共子串。

2.从0到minlen逐个字符串比较,遇到不相同的就直接退出,此时比较到的前n个字符就是最长公共前缀。

3.算法复杂度 O(minlen*strs.size())。

 

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs){
        if(strs.size()==0) return "";
        if(strs.size()==1) return strs[0];
        
        int minlen=strs[0].length();
        for(int i=0;i<strs.size();i++) minlen=minlen<strs[i].length()?minlen:strs[i].length();
        cout<<minlen<<endl;
        int n=0;
        int flag=0;//判断是否相同
        for(int i=0;i<minlen;i++){
            for(int j=1;j<strs.size();j++){
                if(strs[j][i]!=strs[j-1][i]){
                    flag=1;break;
                }
            }
            if(flag==1){
                string res;
                res=strs[0].substr(0,n);//substr(int pos,int len)
                return res;
            }
            n++;
        }
        if(flag==0){ 
            return strs[0].substr(0,minlen);//substr(int pos,int len)
        }
        return "";
    }
};

 

重新熟悉了substr函数的操作:

basic_string substr(size_type _Off = 0,size_type _Count = npos) const;

substr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。

在这题中直接返回子字符串。

 

 

 

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

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

说明:

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


C++
 
 
1
 
class Solution {
2
public:
3
 
    string longestCommonPrefix(vector<string>& strs){
4
        if(strs.size()==0) return "";
5
        if(strs.size()==1) return strs[0];
6
        
7
        int minlen=strs[0].length();
8
        for(int i=0;i<strs.size();i++) minlen=minlen<strs[i].length()?minlen:strs[i].length();
9
        cout<<minlen<<endl;
10
        int n=0;
11
        int flag=0;//判断是否相同
12
 
        for(int i=0;i<minlen;i++){
13
 
            for(int j=1;j<strs.size();j++){
14
 
                if(strs[j][i]!=strs[j-1][i]){
15
                    flag=1;break;
16
                }
17
            }
18
 
            if(flag==1){
19
                string res;
20
                res=strs[0].substr(0,n);//substr(int pos,int len)
21
                return res;
22
            }
23
            n++;
24
        }
25
 
        if(flag==0){ 
 
 
26
            return strs[0].substr(0,minlen);//substr(int pos,int len)
27
        }
28
        return "";
29
    }
30
};

以上是关于leetcode_字节跳动_挑战字符串_最长公共前缀的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 最长公共前缀(探索字节跳动)

leetcode_最长公共前缀

Leetcode_14最长公共前缀

LeetCode刷题记录_最长公共前缀

noi 2.6_1808最长公共子序列(DP)

Leetcode14._最长公共前缀