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

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

  1. 输入: ["flower","flow","flight"]
  2. 输出: "fl"
  3. 输入: ["dog","racecar","car"]
  4. 输出: ""
  5. 解释: 输入不存在公共前缀。

首先理解题意:

  • 当源字符串数组中一个元素也没有,那肯定是返回空字符串了

    1. slen := len(strs)
    2. //特殊情况,当切片中没有任何元素的时候返回""
    3. if slen=={
    4. return ""
    5. }
  • 而最坏的情况就是得到源数组中长度最小的字符串,那我们就要找到最小长度的字符串了
  1. //找出最小长度的字符串、字符串长度以及索引
  2. minLen := math.MaxInt32
  3. minIndex :=
  4. minLenStr := ""
  5. for i := ; i < slen; i++ {
  6. if len(strs[i]) < minLen {
  7. minLen = len(strs[i])
  8. minIndex = i
  9. minLenStr = strs[i]
  10. }
  11. }
  • 然后我们就可以对源字符串中的每一个元素与最小长度的那个字符串比较了,但是考虑到空间和时间的问题,我们可以先把源字符串中的那个最小长度的字符串去掉,然后再进行比较

    1. //先对上面得到的最小长度的字符串进行for循环,得到每一个字符
    2. //然后对源切片strs剩下的元素进行for循环,得到strs中每个元素的第一位字符,与最小长度得到的字符相比
    3. //最后把相同的字符加到返回值中去
    4. for _, c := range minLenStr {
    5. for z := ; z < len(strs); z++ {
    6. if string(c) == string(strs[z][]) {
    7. strs[z] = strs[z][:]
    8. } else {
    9. return result
    10. }
    11. }
    12. result += string(c)
    13. }
    14. return result

    这里有个小技巧,就是每次只比对源字符串数组剩下的元素的第一位,如果是与最小字符串对应位置的一样,那我们就把源字符串数组对应的元素去除掉第一个字符

    整体代码:
    1. func longestCommonPrefix(strs []string) string {
    2. result := ""
    3. slen := len(strs)
    4. //特殊情况,当切片中没有任何元素的时候返回""
    5. if slen=={
    6. return ""
    7. }
    8.  
    9. //找出最小长度的字符串、字符串长度以及索引
    10. minLen := math.MaxInt32
    11. minIndex :=
    12. minLenStr := ""
    13. for i := ; i < slen; i++ {
    14. if len(strs[i]) < minLen {
    15. minLen = len(strs[i])
    16. minIndex = i
    17. minLenStr = strs[i]
    18. }
    19. }
    20.  
    21. //在strs去除掉长度最小的字符串
    22. strs = append(strs[:minIndex], strs[minIndex+:]...)
    23.  
    24. //先对上面得到的最小长度的字符串进行for循环,得到每一个字符
    25. //然后对源切片strs剩下的元素进行for循环,得到strs中每个元素的第一位字符,与最小长度得到的字符相比
    26. //最后把相同的字符加到返回值中去
    27. for _, c := range minLenStr {
    28. for z := ; z < len(strs); z++ {
    29. if string(c) == string(strs[z][]) {
    30. strs[z] = strs[z][:]
    31. } else {
    32. return result
    33. }
    34. }
    35. result += string(c)
    36. }
    37. return result
    38. }

    当然我们也有另外一种思考方式,那就是比较不一样的,当不一样,那我们就返回源切片的对应元素的对应索引,不然就直接返回最小长度的字符串

    1. for i, c := range minLenStr {
    2. for z := ; z < len(strs); z++ {
    3. if strs[z][i] != byte(c) {
    4. return strs[z][:i]
    5. }
    6. }
    7. }
    8. return minLenStr

最长公共前缀的golang实现的更多相关文章

  1. [转][LeetCode]Longest Common Prefix ——求字符串的最长公共前缀

    题记: 这道题不难但是很有意思,有两种解题思路,可以说一种是横向扫描,一种是纵向扫描. 横向扫描:遍历所有字符串,每次跟当前得出的最长公共前缀串进行对比,不断修正,最后得出最长公共前缀串. 纵向扫描: ...

  2. lintcode :最长公共前缀

    题目 最长公共前缀 给k个字符串,求出他们的最长公共前缀(LCP) 样例 在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP ...

  3. LeetCode Longest Common Prefix 最长公共前缀

    题意:给多个字符串,返回这些字符串的最长公共前缀. 思路:直接逐个统计同一个位置上的字符有多少种,如果只有1种,那么就是该位是相同的,进入下一位比较.否则终止比较,返回前缀.可能有一个字符串会比较短, ...

  4. 扩展KMP--求字符串S的所有后缀和字符串T的最长公共前缀

    在解上面这个问题前我们要先解决一个类似的问题:求字符串s的所有后缀和s本身的最长公共前缀: 我们用next[]数组保存这些值: 现在我们假设要求next[ x ],并且next[ i ] 0<i ...

  5. BNUOJ34990--Justice String (exkmp求最长公共前缀)

    Justice String Given two strings A and B, your task is to find a substring of A called justice strin ...

  6. [Swift]LeetCode14. 最长公共前缀 | Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. If there is n ...

  7. [LeeCode]14. 最长公共前缀

    题目链接:https://leetcode-cn.com/problems/longest-common-prefix/ 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀 ...

  8. python(leetcode)-14最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  9. leetcode-14最长公共前缀

    leetcode-14最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower& ...

随机推荐

  1. 图像处理池化层pooling和卷积核

    1.池化层的作用 在卷积神经网络中,卷积层之间往往会加上一个池化层.池化层可以非常有效地缩小参数矩阵的尺寸,从而减少最后全连层中的参数数量.使用池化层即可以加快计算速度也有防止过拟合的作用. 2.为什 ...

  2. MongoDB使用优化

    一.监控 mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令:db.getProfilingLevel()返回level等级,值为0|1|2,分别代表 ...

  3. leetcode — container-with-most-water

    /** * Source : https://oj.leetcode.com/problems/container-with-most-water/ * * Created by lverpeng o ...

  4. 只知道ajax?你已经out了

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 随着前端技术的发展,请求服务器数据的方法早已不局限于ajax.jQuery的ajax方法.各种js库已如雨 ...

  5. 将tomcat添加为linux系统服务

    前言 在博客 --> virtualBox安装centos,并搭建tomcat中,讲到了centos下搭建tomcat环境,发现启动tomcat不是那么方便,要是忘记路径了,那就更麻烦了!当然了 ...

  6. Angular2入门:TypeScript的类型 - let , var, const

    一.let 二.const

  7. C#实现接口IHttpModule完成统一的权限验证

    测试代码如下: using System; using System.Collections.Generic; using System.Text; using System.Collections; ...

  8. [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现

    合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...

  9. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  10. Java程序设计概述

    摘要:1996年Java第一次发布就引起了人们的广大关注.本文简要地介绍一下Java语言的发展历史. 一.Java程序设计平台 Java是一种优秀的程序设计语言.一旦一种语言应用于某个领域,与现存代码 ...