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) 返回结果