【字符串 简单】LeetCode 14. 最长公共前缀 Java

这篇具有很好参考价值的文章主要介绍了【字符串 简单】LeetCode 14. 最长公共前缀 Java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【字符串 简单】LeetCode 14. 最长公共前缀 Java,LeetCode,leetcode,java,算法
我的思路:

  1. 给字符串数组按照字符串的长度从长到短排序,因为最长公共前缀最长的话,也只能是字符串数组中最短的那一个字符串
  2. 设置一个index变量,表示当前正在检查字符数组中所有字符串的index位置
  3. 循环遍历字符串数组n遍,n也就是最长公共前缀的长度
import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int index = 0;
        Arrays.sort(strs, Comparator.comparingInt(String::length));

        while (index < strs[0].length()) {
            boolean isSame = true;
            char c = strs[0].charAt(index);
            for (int i = 1; i < strs.length; i++) {
                if (c != strs[i].charAt(index)) {
                    isSame = false;
                    break;
                }
            }
            if (!isSame) {
                return strs[0].substring(0, index);
            }
            index++;
        }
        return strs[0];
    }
}

【字符串 简单】LeetCode 14. 最长公共前缀 Java,LeetCode,leetcode,java,算法

其他思路,方法一,横向扫描

用LCP(S1,S2,…,Sn)表示字符串S1,S2,…Sn的最长公共前缀。

那么,LCP(S1,S2,…,Sn) = LCP(LCP(LCP(S1,S2),S3),…Sn)

基于该结论,可以得到一种查找字符串数组中的最长公共前缀的简单方法。依次遍历字符串数组中的每一个字符串,对于每个遍历到字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。

如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        String prefix = strs[0];
        int count = strs.length;
        for (int i = 1; i < count; i++) {
            prefix = longestCommonPrefix(prefix, strs[i]);
            if (prefix.length() == 0) {
                break;
            }
        }
        return prefix;
    }

    public String longestCommonPrefix(String str1, String str2) {
        int length = Math.min(str1.length(), str2.length());
        int index = 0;
        while (index < length && str1.charAt(index) == str2.charAt(index)) {
            index++;
        }
        return str1.substring(0, index);
    }
}

复杂度分析:

  • 时间复杂度:O(mn),其中,m是字符串数组中的字符串的平均长度,n是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
  • 空间复杂度:O(1)。使用的额外空间复杂度为常数。

【字符串 简单】LeetCode 14. 最长公共前缀 Java,LeetCode,leetcode,java,算法
其他思路,方法二,纵向扫描

纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同,则当前列不属于公共前缀,当前列之前的部分为最长公共前缀。

class Solution {
    public String longestCommonPrefix(String[] strs) {

        //字符串数组中第一个字符串的长度
        int length = strs[0].length();

        //字符串数组的长度
        int count = strs.length;

        //最长公共前缀的长度一定不会超过字符串数组中第一个字符串的长度
        for (int i = 0; i < length; i++) {

            //开始纵向比较
            char c = strs[0].charAt(i);
            for (int j = 1; j < count; j++) {
                if (i == strs[j].length() || c != strs[j].charAt(i)) {
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0];
    }
}

【字符串 简单】LeetCode 14. 最长公共前缀 Java,LeetCode,leetcode,java,算法
方法三,分治

注意,LCP的计算满足结合律,有以下结论:

LCP(S1…Sn) = LCP(LCP(S1…Sk),LCP(Sk+1…Sn))

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int strsLength = strs.length;
        return longestCommonPrefix(strs, 0, strsLength - 1);
    }


    public String longestCommonPrefix(String[] strs, int start, int end) {
        if (start == end) {
            return strs[start];
        }
        if (end - start == 1) {
            return commonPrefix(strs[start], strs[end]);
        }
        int mid = (start + end) / 2;
        String lcpLeft = longestCommonPrefix(strs, start, mid);
        String lcpRight = longestCommonPrefix(strs, mid + 1, end);
        return commonPrefix(lcpLeft, lcpRight);
    }

    public 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);
    }
}

复杂度分析:

  • 时间复杂度:O(mn),其中m是字符串数组中的字符串的平均长度,n是字符串的数量。时间复杂度的递推式是 T ( n ) = 2 ⋅ T ( n 2 ) + O ( m ) T(n)=2 \cdot T(\frac{n}{2})+O(m) T(n)=2T(2n)+O(m),通过计算可得 T ( n ) = O ( m n ) T(n)=O(mn) T(n)=O(mn)
  • 空间复杂度:KaTeX parse error: Undefined control sequence: \logn at position 4: O(m\̲l̲o̲g̲n̲),其中m是字符串数组中的字符串的平均长度,n是字符串的数量。空间复杂度主要取决于递归调用的层数,层数最大为KaTeX parse error: Undefined control sequence: \logn at position 1: \̲l̲o̲g̲n̲,每层需要m的空间存储返回结果。

【字符串 简单】LeetCode 14. 最长公共前缀 Java,LeetCode,leetcode,java,算法
方法四,二分查找

显然,最长公共前缀的长度不会超过字符串数组中的最短字符串的长度。用minLength表示字符串数组中的最短字符串的长度,则可以在[0,minLength]的范围内通过二分查找得到最长公共前缀的长度,每次取查找范围的中间值mid,判断每个字符串的长度为mid的前缀是否相同,如果相同则最长公共前缀的长度一定大于或等于mid,如果不相同则最长公共前缀的长度一定小于mid,通过上述方式将查找范围缩小一半,直到得到最长公共前缀的长度。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int minLength = Integer.MAX_VALUE;
        for (String str : strs) {
            minLength = Math.min(minLength, str.length());
        }
        int left = 0;
        int right = minLength;
        //[left,right)

        while (left < right) {
            //在偶数长度的区间时,mid往右边靠
            int mid = (left + right + 1) / 2 ;
            //int mid = (left + right + 1) / 2;
            if (isCommonPrefix(strs, mid)) {
                //可能mid就是最长公共前缀的长度
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        //最后一次left的值,肯定是合理的
        return strs[0].substring(0, left);
    }

    public boolean isCommonPrefix(String[] strs, int length) {
        //拿到数组中的第一个字符串中的长度为length的子串
        String str0 = strs[0].substring(0, length);

        //获取整个字符串数组的长度
        int count = strs.length;

        for (int i = 1; i < count; i++) {
            String str = strs[i];
            for (int j = 0; j < length; j++) {
                if (str0.charAt(j) != str.charAt(j)) {
                    return false;
                }
            }
        }
        return true;
    }
}

复杂度分析:

  • 时间复杂度:O(mnlogm),其中m是字符串数组中的字符串的最小长度,n是字符串的数量。二分查找的迭代执行次数是O(logm),每次迭代最多需要比较mn个字符,因此总时间复杂度是O(mnlogm)
  • 空间复杂度:O(1),使用的额外空间复杂度是常数

【字符串 简单】LeetCode 14. 最长公共前缀 Java,LeetCode,leetcode,java,算法文章来源地址https://www.toymoban.com/news/detail-552379.html

到了这里,关于【字符串 简单】LeetCode 14. 最长公共前缀 Java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 刷题笔记之七(统计每个月兔子的总数+汽水瓶+查找两个字符串a,b中的最长公共子串+公共子串计算)

    目录 1. 数据库中,count不会返回null值,max和concat可能会返回null值 2. 数据库特点: 共享性高,冗余度小,安全性强,独立性强 3.  top是sql server中的,用于求前n条数据 4. 数据库使用函数进行全部扫描(数据遍历)最慢,并且函数执行本身也是需要耗时的 5.  使用%作为

    2023年04月09日
    浏览(32)
  • LeetCode 2559. 统计范围内的元音字符串数:前缀和

    力扣题目链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/ 给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] = [l i , r i ] 会要求我们统计在 words 中下标在 l i 到 r i 范围内( 包含 这两个值)并且以元音开头和结尾的字符串的数目。

    2024年02月07日
    浏览(37)
  • [Leetcode] 0014. 最长公共前缀

    点击上方,跳转至Leetcode 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串  \\\"\\\" 。 示例 1: 示例 2: 提示: 1 = strs.length = 200 0 = strs[i].length = 200 strs[i] 仅由小写英文字母组成 横向扫描:写一个longestCommonPrefix方法,用于返回两个字符串的

    2024年02月10日
    浏览(37)
  • 【五一创作】( 字符串) 409. 最长回文串 ——【Leetcode每日一题】

    难度:简单 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 \\\"Aa\\\" 不能当做一个回文字符串。 示例 1: 输入:s = “abccccdd” 输出:7 解释: 我们可以构造的最长的回文串是\\\"dccaccd\\\", 它的长度是

    2024年02月01日
    浏览(39)
  • (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

    难度:中等 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所

    2024年02月11日
    浏览(45)
  • LeetCode - 1371 每个元音包含偶数次的最长子字符串(Java & JS & Python & C)

    题目来源 1371. 每个元音包含偶数次的最长子字符串 - 力扣(LeetCode) 题目描述 给你一个字符串  s  ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 \\\'a\\\',\\\'e\\\',\\\'i\\\',\\\'o\\\',\\\'u\\\' ,在子字符串中都恰好出现了偶数次。 示例 示例 1 输入:s = \\\"eleetminicoworoep\\\" 输出:

    2024年01月25日
    浏览(34)
  • LeetCode_字符串_简单_415.字符串相加

    给定两个字符串形式的非负整数 num1 和num2,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1: 输入:num1 = “11”, num2 = “123” 输出:“134” 示例 2: 输入:num1 = “

    2024年02月01日
    浏览(33)
  • 【LeetCode题解】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)+2085. 统计出现过一次的公共字符串(哈希表)+2807. 在链表中插入最大公约数

    2645. 构造有效字符串的最少插入数 方法一:计算组数 1.用count统计,能构成几组abc 2.如果当前字符大于之前字符,说明还在组内,不更新 3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新 4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数 方法二

    2024年04月12日
    浏览(46)
  • Day.1 LeetCode刷题练习(最长公共前缀 C/C++两种解法)

    题目: 例子: 分析题目: 主要目的:求出各个字符串的公共前缀 思路(本人解法): 用所给实例来看,不难看出我们可以直接以竖着对应来查看是否是公共前缀 ,  这样就有了一定的思路 , 然后接着想如何让他找到最长的公共前缀后就 停止下来呢  这样就能想到,从最

    2024年02月11日
    浏览(27)
  • 华为OD机试 - 提取字符串中的最长合法简单数学表达式(Java & JS & Python & C)

    题目描述 提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回 0 。 简单数学表达式只能包含以下内容: 0-9数字,符号+-* 说明: 所有数字,计算结果都不超过long 如果有多个长度一样的,请返回第一个表达式的结果 数学表达

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包