1. 获取两个字符串中最大相同子串

获取两个字符串中最大相同子串

分析

比如有两个字符串
str1 = “eysdfghjkl”;
str2 = “cxbghjp”;
需要找出这里两个字符串中最大的字符子串,这里就是**“ghj”**.

查找的方法就是把两个字符串中较短的那个依次减小,然后按照该长度在短的字符串中获取所有子串依次判断该子串是否存在于长的字符串中.

上面的方法听着是不是很绕.我们详细说明一下吧.

  1. 上面的那两个字符串短的是str2,长度为7,即str2.leng() == 7.这个没有异议吧.
    然后依次减小,先从7开始,str2长度为7的子串只有一个吧,就是str2本身.那判断str2是否是str1的子串.很明显不是.那我们就把上面黑体字部分的定义为第一轮
  2. 那我们开始第二轮,str2的长度依次减小,上一轮的长度为7,那这一轮就是6,那我们就找长度为6的str2的子串,只有两个:
    (1) “cxbghj”
    (2) “xbghjp”
    然后判断上面这两个字符串的是否是str1的子串,也不是.
  3. 继续开始第三轮,第三轮的长度为5,str2长度的子串有3个:
    (1) “cxbgh”
    (2) “xbghj”
    (3) “bghjp”
    判断这三个字符串是否是str1的子串.不是.
  4. 第四轮,长度为4,四个str2的子串
    (1) “cxbg”
    (2) “xbgh”
    (3) “bghj”
    (4) “ghjp”
    也没有是str1的子串.
  5. 第5轮长度为3,5个str的子串.
    (1) “cxb”
    (2) “xbg”
    (3) “bgh”
    (4) “ghj”
    (5) “hjp”

在这一轮对比到(4)的时候判断(4)是str1的子串.就马上退出,就找到了这两个字符串的子串

实现代码如下:

可以通过以下步骤使用滑动窗口算法在 Java 中获取两个字符串中的最大相同子串1. 遍历两个字符串,以其中一个字符串为基准,通过滑动窗口在另一个字符串中查找相同子串。 2. 不断调整窗口大小,记录最大相同子串的长度起始位置。 以下是实现代码: ```java public class LongestCommonSubstring { public static String longestCommonSubstring(String s1, String s2) { int m = s1.length(); int n = s2.length(); int maxLength = 0; int endIndex = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int k = 0; // 滑动窗口开始匹配 while (i + k < m && j + k < n && s1.charAt(i + k) == s2.charAt(j + k)) { k++; } // 更新最大相同子串的长度结束位置 if (k > maxLength) { maxLength = k; endIndex = i + k; } } } // 根据最大长度结束位置截取最大相同子串 return s1.substring(endIndex - maxLength, endIndex); } public static void main(String[] args) { String s1 = "abcdef"; String s2 = "defghi"; String result = longestCommonSubstring(s1, s2); System.out.println("最大相同子串是: " + result); } } ``` 在上述代码中,`longestCommonSubstring` 方法接受两个字符串 `s1` `s2` 作为参数。通过两层循环遍历两个字符串,对于每一个可能的起始位置,使用 `while` 循环作为滑动窗口来匹配相同子串。在匹配过程中,不断更新最大相同子串的长度结束位置。后,根据最大长度结束位置截取最大相同子串并返回。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值