草庐IT

LeetCode - 最长公共前缀

程序员翔仔 2023-03-28 原文

题目信息

源地址:最长公共前缀

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

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

提示信息

示例 1

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

提示 2

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

提示

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

实现逻辑

逐一对比

此方法如其名称,即将数组中的字符串逐一进行对比,先找出第一、第二个字符串的最长公共前缀,再找出第二、第三个字符串的最长公共前缀,以此类推,直至完成所有字符串的比较。

当然,当在对比过程中发现最长公共前缀已经为空,则直接返回即可。

此方式是较为常规的思路,时间复杂度为 \(O(mn)\),其中 m 是字符串数组中字符串的平均长度,n 是字符串数组的长度,最坏情况下,字符串数组中的每个字符串都会被比较一次。

根据代码的写法不同,若利用额外的空间则空间复杂度是 \(O(n)\),若使用数组中的第一个字符串做相关增减,则空间复杂度是 \(O(1)\)

package cn.fatedeity.algorithm.leetcode;

public class LongestCommonPrefix {
    public String answer(String[] strs) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < strs.length; i++) {
            if (stringBuilder.length() > strs[i].length()) {
                stringBuilder.setLength(strs[i].length());
            }
            for (int j = 0; j < strs[i].length(); j++) {
                char c = strs[i].charAt(j);
                if (i == 0) {
                    stringBuilder.append(c);
                    continue;
                } else if (stringBuilder.charAt(j) != c) {
                    stringBuilder.replace(j, stringBuilder.length(), "");
                }
                if (j >= stringBuilder.length() - 1) {
                    break;
                }
            }
            if (stringBuilder.isEmpty()) {
                return stringBuilder.toString();
            }
        }
        return stringBuilder.toString();
    }
}

同时对比

同时对比指的是,每一次对比的时候,都将数组中所有的字符串拿出来进行比较,如同时比较数组中所有字符串的第一个字符,然后比较数组中所有字符串的第二个字符,以此类推,直到已对比完整个字符串,或者所在位置的字符有所不同。

此方法也是常规思路中的一种,时间复杂度为 \(O(mn)\),其中 m 是字符串数组中字符串的最小长度,n 是字符串数组的长度,最坏情况下,字符串数组中的每个字符串都会被比较一次。

空间复杂度同逐一对比方法一样,最低可以做到 \(O(1)\) 的空间复杂度。

package cn.fatedeity.algorithm.leetcode;

public class LongestCommonPrefix {
    public String answer(String[] strs) {
        StringBuilder commonStr = new StringBuilder(strs[0]);
        if (strs.length == 1) {
            return strs[0];
        }
        for (int i = 0; i < strs[0].length(); i++) {
            for (int j = 1; j < strs.length; j++) {
                if (strs[j].length() == i || commonStr.charAt(i) != strs[j].charAt(i)) {
                    commonStr.replace(i, commonStr.length(), "");
                    return commonStr.toString();
                }
            }
        }
        return commonStr.toString();
    }
}

逐一对比优化

这里是一个优化的逐一对比方法,其实也是使用了编程语言的一些特性,直接判断当前的公共前缀是否是下一个字符串的公共前缀,只有满足所有字符串要求的前缀才是最终结果。

实际落实到代码中就是,没有自己将字符串的每一个字符都做比较,而是使用编程代码中已有的方法做比较,实际的时间复杂度没有脱离 \(O(mn)\) 的范畴,但实际效果比自行开发的比较要好。

package cn.fatedeity.algorithm.leetcode;

public class LongestCommonPrefix {
    public String answer(String[] strs) {
        if (strs.length == 1) {
            return strs[0];
        }

        String prefix = strs[0];
        for (String str : strs) {
            while (!str.startsWith(prefix)) {
                prefix = prefix.substring(0, prefix.length() - 1);
                if (prefix.length() == 0) {
                    return "";
                }
            }
        }
        return prefix;
    }
}

有关LeetCode - 最长公共前缀的更多相关文章

  1. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  2. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  3. ruby - 在 Ruby 模块中定义公共(public)方法? - 2

    我一定是犯了n00b错误。我编写了以下Ruby代码:moduleFoodefbar(number)returnnumber.to_s()endendputsFoo.bar(1)测试.rb:6:in':undefinedmethodbar'forFoo:Module(NoMethodError)我想在名为Foo.bar的模块上定义一个方法。但是,当我尝试运行代码时,出现未定义方法错误。我做错了什么? 最佳答案 你可以这样做:moduleFoodefself.bar(number)number.to_sendendputsFoo.bar

  4. IDEA使用LeetCode插件 - 2

    前言我们习惯用idea编写、调试代码,在LeetCode上刷题时,如果能够在IDEA编写代码,并且做好代码管理,是一件事半功倍的事情。对于后续复习题目,做笔记也会非常便利。本文目的在于介绍LeetCodeEditor的使用,以及配置工具类,最终目录结构如下:note:放置笔记src:放置代码leetcode.editor.cn:插件LeetCodeEditor自动生成utils:自定义的工具包,可用于自动化输入测试用例,定义题目需要的类(结构体)out:运行测试时自动生成LeetCodeEditorGitHub:https://github.com/shuzijun/leetcode-edit

  5. ruby - 是否可以动态检查方法可见性范围(私有(private)/公共(public)/ protected )? - 2

    如thisanswer中所述,在Ruby2.1或更高版本中,此代码:classSimpleTestprivatedefine_method:foodo42endend将定义foo作为SimpleTest的私有(private)方法实例。(在Ruby2.0和更早版本中,它不会是私有(private)的。)但是,我希望做一些不那么琐碎的事情。我想定义一个类可以扩展的DSL,并希望DSL在内部定义的方法尊重调用上下文的私有(private)/protected可见性。这可能不是很清楚,所以这里有一个例子:moduleDsldefhas_a(name)define_methodnamedo42

  6. ruby - 为什么 ruby​​ 中的变量前缀允许在方法调用中省略括号? - 2

    在DavidFlanagan的TheRubyProgrammingLanguage中;松本幸弘theystatethatthevariableprefixes($,@,@@)areonepricewepayforbeingabletoomitparenthesesaroundmethodinvocations.谁可以给我解释一下这个? 最佳答案 这是我不成熟的意见。如果我错了,请纠正我。假设实例变量没有@前缀,那么我们如何声明一个实例变量?classMyClassdefinitialize#Herefooisaninstanceva

  7. ruby - Ruby 错误消息中的单字母前缀是什么意思? - 2

    Ruby错误消息通常包含带单字母前缀的词法常量,例如:syntaxerror,unexpectedtIDENTIFIER,expectingkENDt和k从哪里来?还有其他字母吗?可能的关键字的主列表? 最佳答案 对于此类问题,parse.y通常是看的地方。如果没记错的话,'t'代表token,而'k'代表关键字。以下是表示标识符的不同标记(在其他事物的名称意义上):%tokentIDENTIFIERtFIDtGVARtIVARtCONSTANTtCVARtLABEL我通过快速搜索找到的kEND的唯一定义是k_end:k_end:k

  8. ruby-on-rails - 如何在公共(public)事件中设置收件人ID - 2

    我正在查看公共(public)事件GemRailscastVid。(http://railscasts.com/episodes/406-public-activity)我当前的数据库查找/存储除了recipient_id之外的所有内容....它显示为nil#我希望recipient_id是正在执行操作的用户....例如如果我喜欢Tom的帖子......我希望Tom的ID成为recipient_id,我将成为owner_id。我目前已经设置了一个收件人ID....使用我的LikesController中的代码....但它只将收件人ID设置为当前用户....这不是我想要的:(喜欢Cont

  9. ruby - 在公共(public)基本路线之上构建路线? - 2

    我有一个共同的基本路径;说:get/base我需要执行基本身份验证并为该路径下的所有子调用工作。说:get/base/foo和get/base/bar。查看http://www.sinatrarb.com/intro.html#Helpers建议我应该能够通过使用助手来做到这一点。我正在查看pass帮助程序并在文档中触发新路由下使用call。但是,我读到的另一个建议是使用正则表达式IE%r{/base/?:(path)?}或类似的动态路由。那么:def'/base'#dosomefunkybasicauthstuffhere#toworkwithallrequesttothiscomm

  10. ruby-on-rails - Ruby on Rails 3 - 公共(public)实时聊天 - 2

    我想使用Rails3创建一个公共(public)实时聊天应用程序。我在rails2上找到了一些例子。任何人都可以告诉你一个很好的例子/教程来使用rails3开发一个实时聊天应用程序。 最佳答案 当我试图在我的Rails3应用程序中实现一个公共(public)和私有(private)聊天系统时,我遇到了几个障碍。我查看了faye、juggernaut、node.js等。最终在尝试了几种方法之后,我能够实现一个运行良好的系统:1)我开始关注Railscast260中的faye消息传递视频指南。正如DevinM所提到的,我能够快速设置一个

随机推荐