博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Longest Common Prefix 最长共同前缀
阅读量:6823 次
发布时间:2019-06-26

本文共 3806 字,大约阅读时间需要 12 分钟。

 

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","flow","flight"]Output: "fl"

Example 2:

Input: ["dog","racecar","car"]Output: ""Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

 

这道题让我们求一系列字符串的共同前缀,没有什么特别的技巧,无脑查找即可,我们定义两个变量i和j,其中i是遍历搜索字符串中的字符,j是遍历字符串集中的每个字符串。这里将单词上下排好,则相当于一个各行长度有可能不相等的二维数组,我们遍历顺序和一般的横向逐行遍历不同,而是采用纵向逐列遍历,在遍历的过程中,如果某一行没有了,说明其为最短的单词,因为共同前缀的长度不能长于最短单词,所以此时返回已经找出的共同前缀。我们每次取出第一个字符串的某一个位置的单词,然后遍历其他所有字符串的对应位置看是否相等,如果有不满足的直接返回res,如果都相同,则将当前字符存入结果,继续检查下一个位置的字符,参见代码如下:

 

C++ 解法一:

class Solution {public:    string longestCommonPrefix(vector
& strs) { if (strs.empty()) return ""; string res = ""; for (int j = 0; j < strs[0].size(); ++j) { char c = strs[0][j]; for (int i = 1; i < strs.size(); ++i) { if (j >= strs[i].size() || strs[i][j] != c) { return res; } } res.push_back(c); } return res; }};

 

Java 解法一:

public class Solution {    public String longestCommonPrefix(String[] strs) {        if (strs == null || strs.length == 0) return "";        String res = new String();        for (int j = 0; j < strs[0].length(); ++j) {            char c = strs[0].charAt(j);            for (int i = 1; i < strs.length; ++i) {                if (j >= strs[i].length() || strs[i].charAt(j) != c) {                    return res;                }            }            res += Character.toString(c);        }        return res;    }}

 

我们可以对上面的方法进行适当精简,如果我们发现当前某个字符和下一行对应位置的字符不相等,说明不会再有更长的共同前缀了,我们直接通过用substr的方法直接取出共同前缀的子字符串。如果遍历结束前没有返回结果的话,说明第一个单词就是公共前缀,返回为结果即可。代码如下:

 

C++ 解法二:

class Solution {public:    string longestCommonPrefix(vector
& strs) { if (strs.empty()) return ""; for (int j = 0; j < strs[0].size(); ++j) { for (int i = 0; i < strs.size() - 1; ++i) { if (j >= strs[i].size() || j >= strs[i + 1].size() || strs[i][j] != strs[i + 1][j]) { return strs[i].substr(0, j); } } } return strs[0]; }};

 

Java 解法二:

public class Solution {    public String longestCommonPrefix(String[] strs) {        if (strs == null || strs.length == 0) return "";        for (int j = 0; j < strs[0].length(); ++j) {            for (int i = 0; i < strs.length - 1; ++i) {                if (j >= strs[i].length() || j >= strs[i + 1].length() || strs[i].charAt(j) != strs[i + 1].charAt(j)) {                    return strs[i].substring(0, j);                   }            }        }        return strs[0];    }}

 

我们再来看一种解法,这种方法给输入字符串数组排了个序,想想这样做有什么好处?既然是按字母顺序排序的话,那么有共同字母多的两个字符串会被排到一起,而跟大家相同的字母越少的字符串会被挤到首尾两端,那么如果有共同前缀的话,一定会出现在首尾两端的字符串中,所以我们只需要找首尾字母串的共同前缀即可。比如例子1排序后为 ["flight", "flow", "flower"],例子2排序后为 ["cat", "dog", "racecar"],虽然例子2没有共同前缀,但也可以认为共同前缀是空串,且出现在首尾两端的字符串中。由于是按字母顺序排的,而不是按长度,所以首尾字母的长度关系不知道,为了防止溢出错误,我们只遍历而这种较短的那个的长度,找出共同前缀返回即可,参见代码如下:

 

C++ 解法三:

class Solution {public:    string longestCommonPrefix(vector
& strs) { if (strs.empty()) return ""; sort(strs.begin(), strs.end()); int i = 0, len = min(strs[0].size(), strs.back().size()); while (i < len && strs[0][i] == strs.back()[i]) ++i; return strs[0].substr(0, i); }};

 

Java 解法三:

class Solution {    public String longestCommonPrefix(String[] strs) {        if (strs == null || strs.length == 0) return "";        Arrays.sort(strs);        int i = 0, len = Math.min(strs[0].length(), strs[strs.length - 1].length());        while (i < len && strs[0].charAt(i) == strs[strs.length - 1].charAt(i)) i++;        return strs[0].substring(0, i);    }}

 

参考资料:

 

转载地址:http://ueezl.baihongyu.com/

你可能感兴趣的文章
C/C++——strcpy函数的实现
查看>>
KMP算法
查看>>
leetcode------Symmetric Tree
查看>>
spring声明式事务 同一类内方法调用事务失效
查看>>
C# 利用ICSharpCode.SharpZipLib实现在线加密压缩和解密解压缩
查看>>
zookeeper项目使用几点小结
查看>>
杂物论第一 中华文明的根基
查看>>
c#中 枚举类型的使用(转)
查看>>
linux应用之tomcat的安装及配置(centos)
查看>>
bytes与str
查看>>
转:Socket原理与编程基础
查看>>
linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码
查看>>
记录DHT网络主要功能步骤
查看>>
VS2010使用Qt库
查看>>
Python特殊语法--filter、map、reduce、lambda
查看>>
[原] Jenkins Android 自动打包配置(转)
查看>>
[Redux] Passing the Store Down with <Provider> from React Redux
查看>>
javascript笔记7-事件
查看>>
大数据处理分析的六大最好工具
查看>>
【转】俞军给淘宝产品经理的分享
查看>>