14--leetcode--最大公共子串

本文介绍了一种算法,用于从一系列字符串中找到最长的共同前缀。通过比较每个字符串的字符,直到发现不同之处,从而确定最长公共子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找到最短的字符串

 

已list[0]为标准,遍历list,加单个字符串右指针,不同即已到最长公共字串,返回

 

 

class Solution(object):
    def longestCommonPrefix(self, strs):
        if not strs:
            return ""
        if len(strs) == 1:
            return strs[0]
        #minl = min([len(x) for x in strs])
        l=[]                                                         #最短字符串
        for i in strs:
            l.append(len(i))
        minl=min(l)
        end = 0
        while end < minl:
            for i in range(1,len(strs)):                 #不同便已是最长
                if strs[i][end]!= strs[i-1][end]:
                    return strs[0][:end]
            end += 1
        return strs[0][:end]

        

### Java 实现最长公共子串 LeetCode 题解 对于寻找两个字符串之间的最长公共子串问题,在处理过程中通常采用动态规划方法来解决。该算法通过构建一个二维数组 `dp` 来记录两个字符串之间字符匹配的情况。 具体来说,当遍历到 `text1[i-1] == text2[j-1]` 时,则有 `dp[i][j] = dp[i-1][j-1] + 1` 表明当前字符相等并延续之前的连续相同字符计数;如果不相等则设置为零因为这里关注的是连续相同的子串而非子序列[^1]。 下面是一个完整的解决方案: ```java class Solution { public String longestCommonSubstring(String str1, String str2) { int m = str1.length(); int n = str2.length(); // 创建DP表 int[][] dp = new int[m + 1][n + 1]; // 记录最大长度及其结束位置 int maxLength = 0; int endIndex = -1; for (int i = 1; i <= m; ++i){ char c1 = str1.charAt(i - 1); for (int j = 1; j <= n; ++j){ char c2 = str2.charAt(j - 1); if(c1 == c2){ dp[i][j] = dp[i - 1][j - 1] + 1; if(dp[i][j] > maxLength){ maxLength = dp[i][j]; endIndex = i - 1; } }else{ dp[i][j] = 0; } } } // 如果找到了有效结果就截取出来作为最终答案 return maxLength != 0 ? str1.substring(endIndex - maxLength + 1,endIndex + 1): ""; } } ``` 此代码实现了上述逻辑,并能够有效地找出给定两字符串间的最长公共子串。注意这里的实现方式与最长公共子序列不同之处在于一旦遇到不匹配即重置计数值为零以确保只考虑连续部分[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值