14、最长公共前缀子串

  1. 14、最长公共前缀子串
    1. 示例 1:
    2. 示例 2:
  2. 题解
    1. 1、纵向扫描
    2. 2、横向扫描
    3. 3、分治——二分横向扫描

14、最长公共前缀子串

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

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

示例 1:

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

示例 2:

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

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

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

题解

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 c = strs[0].charAt(i);
            for (int j =1;j < strs.length;j++) {
                if (i == strs[j].length() || strs[j].charAt(i) != c) {// 到达结尾 或者 字符不等
                    return strs[0].substring(0,i);
                }
            }
        }
        // 返回结果
        return strs[0];
    }
}

2、横向扫描

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 异常判断
        if (strs.length == 0) {return "";}
        // 取第一个字符串
        String prefix = strs[0];
        // 遍历判断
        for (int i = 1;i < strs.length;++i) {// 遍历剩余字符串
            while (strs[i].indexOf(prefix) != 0) {// 字符串i的字串prefix第一次出现的索引不为0
                prefix = prefix.substring(0,prefix.length() - 1);// 更新字串,将字符串的长度剪1
                if (prefix.isEmpty()) return "";// 减到最后一个都没有公共字串,直接return 空
            }
        }
        //返回结果
        return prefix;

    }
}

3、分治——二分横向扫描

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        } else {
            return longestCommonPrefix(strs,0,strs.length - 1);
        }
    }

    private String longestCommonPrefix(String[] strs,int start,int end) {
        if (start == end) {
            return strs[start];
        } else {
            // 二分递归
            int mid = (end - start) / 2 + start;
            String lcpLeft = longestCommonPrefix(strs,start,mid);
            String lcpRight = longestCommonPrefix(strs,mid + 1,end);
            return commonPrefix(lcpLeft,lcpRight);
        }
    }

    private String commonPrefix(String lcpLeft,String lcpRight) {
        int minLength = Math.min(lcpLeft.length(),lcpRight.length());
        for (int i = 0;i < minLength;i++) {
            if (lcpLeft.charAt(i) != lcpRight.charAt(i)) {
                return lcpLeft.substring(0,i);
            }
        }
        return lcpLeft.substring(0,minLength);
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:14、最长公共前缀子串

Count:492

Author:攀登

Created At:2020-07-26, 00:19:44

Updated At:2024-06-15, 15:52:32

Url:http://jiafeimao-gjf.github.io/2020/07/26/14%E3%80%81%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%89%8D%E7%BC%80%E5%AD%90%E4%B8%B2/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation