【剑指offer】NC127 最长公共子串 [Go语言]

131 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

描述

  • 给定两个字符串str1和str2,输出两个字符串的最长公共子串

  • 题目保证str1和str2的最长公共子串存在且唯一。

  • 数据范围: 1≤∣str1∣,∣str2∣≤5000

  • 要求: 空间复杂度 O(n^2),时间复杂度 O(n^2)

示例1

输入:

"1AB2345CD","12345EF"

返回值:

"2345"

备注:

1  ∣str1∣,∣str2∣  5000

题解

这里我们可以直接使用string函数中有一个包括的函数方法,我们不断进行遍历一个字符串,然后查看是否包含在另外一个字符串中,那么我们就可以进行最大值的判断,并且返回最大值。 不过面试的时候建议一定要了解这个strings的实现,不然可能会翻车。

func LCS( str1 string ,  str2 string ) string {
(1)    l,r,lc,rc,max := 0,1,0,1,1
(2)    for ;r<=len(str2);r++{
(3)        if ok := strings.Contains(str1,str2[l:r]);ok{
(4)            if r-l>max{
(5)                max = r-l
(6)                lc,rc = l,r
            }
        } else {
(7)            l++
        }
    }
(8)    return str2[lc:rc]
}
  • (1) 初始化l,r用于进行遍历,lc,rc用作进行记录最优解。max作为最大值的记录
  • (2) 对str2进行循环
  • (3) 调用 strings 的函数,如果这个str1包括了str2[l:r],也就是包括了str2的字串,那么就可以使用进行判断了
  • (4) 如果这个下标相减的值比最大值大的话
  • (5) 那么最大值就进行更新
  • (6) 然后记录此时的左下标和右下标
  • (7) 如果不包含就左边进行++操作,下一个字串开始
  • (8) 返回结果