Java日常练习题,每天进步一点点(28)

yizhihongxing

题目:给定两个字符串,找到这两个字符串中最长的公共连续子字符串。

示例1:

输入: str1 = "ABCD" ,str2 = "CBCE"
输出: "BC"

示例2:

输入: str1 = "ABC" ,str2 = "DEF"
输出: ""

分析:题目要求找到两个字符串的最长公共连续子字符串,我们可以通过动态规划算法来解决此类问题。具体思路是,定义一个二维数组dp,其中dp[i][j]表示字符串str1的第i个字符和字符串str2的第j个字符之前的最长公共子串的长度。若当前两个字符相等,则可以推出状态转移方程dp[i][j] = dp[i-1][j-1] + 1,否则dp[i][j] = 0。最后找到数组中的最大值,并根据长度截取公共子串即可。

代码示例:

public static String longestCommonSubString(String str1, String str2) {
    int[][] dp = new int[str1.length()+1][str2.length()+1];
    int maxLen = 0;
    int end = 0;
    for (int i = 1; i <= str1.length(); i++) {
        for (int j = 1; j <= str2.length(); j++) {
            if (str1.charAt(i-1) == str2.charAt(j-1)) {
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            if (dp[i][j] > maxLen) {
                maxLen = dp[i][j];
                end = i-1;
            }
        }
    }
    return str1.substring(end-maxLen+1, end+1);
}

代码说明:本代码在二维数组dp初始化时为了方便后续处理,二维数组第一维和第二维分别加了1,最后找到数组中的最大值并根据长度截取公共子串时需要考虑边界情况。

示例1解析:在str1="ABCD" 和 str2="CBCE"的情况下,根据动态规划算法得到的dp数组如下所示,其中11表示B和B的公共连续子串长度为1,22表示BC和BC的公共连续子串长度为2:

C B C E
0 0 0 0 0
A 0 0 0 0 0
B 0 0 1 2 0
C 0 1 0 0 1
D 0 0 0 0 0

最后找到dp数组中的最大值为22,因此返回的结果为"BC"。

示例2解析:在str1="ABC" 和 str2="DEF"的情况下,根据动态规划算法得到的dp数组如下所示,其中公共连续子串长度均为0:

D E F
0 0 0 0
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0

最后找到dp数组中的最大值为0,因此返回的结果为""。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java日常练习题,每天进步一点点(28) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • python读写json文件的简单实现

    当我们需要对数据进行存储和传递的时候,一种非常常用的格式就是JSON。而在Python中,对于JSON的读写也变得非常的简单,下面就来详细的介绍一下读写JSON的攻略。 1. 读取JSON文件 在Python中,我们使用json模块来读写JSON文件。 首先要做的就是打开文件,接着使用json.load()来读取: import json with open…

    C 2023年5月23日
    00
  • json对象转字符串如何实现

    首先,需要明确一下,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web应用程序之间的数据交换。JSON对象是一种由“键/值”对组成的数据结构,可以通过一些库函数将其转化为字符串形式。 下面是JSON对象转字符串的方法: 1.使用JSON.stringify()方法 JSON.stringify()是将…

    C 2023年5月23日
    00
  • 基于一致性hash算法 C++语言的实现详解

    下面是 “基于一致性Hash算法C++语言的实现详解” 的攻略。 简介 一致性Hash算法是分布式系统中常用的一种负载均衡算法。C++ 语言是一种高效的编程语言,有着广泛的应用。本篇攻略将通过分析一致性Hash算法的实现,详细讲解如何在C++语言中实现这一算法,并给出两个示例说明。 一致性Hash算法的实现 步骤一:将服务器节点映射到一个环上 一致性Hash…

    C 2023年5月22日
    00
  • C语言扫雷游戏的简单实现

    C语言扫雷游戏的简单实现攻略 一、游戏规则 扫雷是一款益智休闲游戏,其规则如下: 通过左键单击格子,可以将其翻开。如果格子为空白格,则会显示出周围8个格子中的雷数; 如果翻开的格子周围没有雷,则需要自动翻开周围的所有格子,直到边界或者有雷的格子; 通过右键单击格子,可以标记该格子为有雷的格子(或者是有疑问的格子)。一般来说,标记出所有的炸弹格子就算游戏胜利;…

    C 2023年5月23日
    00
  • C语言系统调用约定

    C语言系统调用约定 在C语言中,系统调用使得程序能够与操作系统进行交互,包括执行I/O操作、内存管理等等。C语言中的系统调用约定是指C语言程序如何调用操作系统提供的系统调用。在不同的操作系统中,系统调用的约定可能不同,因此我们需要针对不同的操作系统学习和使用不同的系统调用约定。 基本概念 在C语言中,我们可以使用syscall函数进行系统调用。syscall…

    C 2023年5月23日
    00
  • C++初阶教程之类和对象

    C++初阶教程之类和对象 前言 C++ 是十分强大,适用面广泛的编程语言之一。它拥有面向对象和面向过程两种编程方式,是许多常用软件背后的编程语言。因此,掌握 C++ 编程,对于软件开发人员和编程学习者来说都是非常有益的。 其中,类和对象是 C++ 的面向对象编程的核心,也是学习 C++ 的重点内容。下面,就让我们来详细讲解一下“C++初阶教程之类和对象”的完…

    C 2023年5月22日
    00
  • C++核心编程之内存分区详解

    C++核心编程之内存分区详解 C++程序运行时,内存会被划分为几个不同的区域,每个区域都有特定的用途和属性。理解这些内存分区对于程序员来说是非常重要的,因为它可以帮助我们更好地理解代码的执行过程,从而更好地优化代码并避免内存泄漏等问题。 内存分区类型 C++程序运行时,内存主要被分成以下几个区域。 代码区 代码区存储程序的指令,包括函数体的二进制代码。代码区…

    C 2023年5月23日
    00
  • C语言实现的猴子偷桃之类算法

    C语言实现的猴子偷桃之类算法 算法思路 猴子偷桃是一个经典的算法问题,其思路如下: 有一堆桃子,猴子第一天吃掉一半,发现还不过瘾,就又吃了一个;第二天又吃掉剩下的一半,发现还不过瘾,又吃了一个;以后每天都这样吃,直到最后只剩一个桃子为止。求原来有多少桃子。 为了方便解题,我们可以反向思考,即从最后一天向前推断。假设在第N天时只剩下一个桃子,那么在第N-1天时…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部