java获取两个字符串中最大子串(支持多个最大子串)

最近在重温String相关的方法,其中的一道算法题,获取两个字符串中最大子串,觉得比较有意思,于是在网上搜了一下相关文章,虽然都实现了并且查找到了最大子串,但没有考虑到同时存在多个最大子串的情况,下面根据尚硅谷宋老师的教学视频,对此算法进行一个记录,代码如下:

import java.util.Arrays;

/**
 * @description 获取两个字符串中最大相同子串
 */
public class GetMaxString {
    public static void main(String args[]) {
        String s1 = "qwerabcdtyuiopqwer";
        String s2 = "xcabcdvbnqwer";

        String []s = getMaxSameString(s2, s1);
        System.out.println(Arrays.toString(s));
    }

    public static String[] getMaxSameString(String str1, String str2) {
        // 判断str1,str2不能为空,为空则返回null
        if(null == str1 || "".equals(str1) || null == str2 || "".equals(str2)) {
            return null;
        }
        String max = null, min = null;
        // 判断str1和str2的长度,长的字符作为max字符,用来包含短的字符min字符
        max = str1.length() > str2.length() ? str1 : str2;
        min = str1.length() > str2.length() ? str2 : str1;
        System.out.println("maxStr:" + max);
        System.out.println("minStr:" + min);

        StringBuilder ab = new StringBuilder();

        // 外层循环,用来循环min字符串,用来控制内循环中,最大子串的长度
        for (int i = 0; i < min.length(); i++) {
            // 内层循环,每次从min字符串的0下标开始,到min长度-i,进行截取,获取最大子串;
            // b <= min.length(),用来控制截取的长度超过min.length(),导致无意义或者出现bug;
            // 第一次是截取min.substring(0,min.length()),即整个min字符串的长度;
            // 第二次是截取min.substring(0,min.length()-1),min.substring(1,min.length()),两个最大子串;
            // 第三次是截取min.substring(0,min.length()-2),min.substring(1,min.length()-1),min.substring(2,min.length()),三个最大子串;
            // 依次类推,依次查找从大到小的子串,直至找到最大的子串,写入输出结果中,break终止循环
            for(int a = 0,b = min.length()-i; b <= min.length(); a++,b++){
                // 截取字符串
                String sub = min.substring(a, b);
                // 是否包含字符串
                if(max.contains(sub)) {
                    ab.append(sub + ",");
                }
            }
            // 最大子串结果集不为空,则表示已找到最大子串,break终止循环
            if(ab.length() != 0) {
                break;
            }
        }
        // 可能包含多个最大子串,分隔成数组
        String [] split = ab.substring(0, ab.length() - 1).split(",");
        return split;
    }
}

具体思路及过程,已在代码注释中描述,看一下运行结果:

"C:\Program Files (x86)\Java\jdk1.8.0_131\bin\java.exe" ...
minStr:xcabcdvbnqwer
[abcd, qwer]

从结果上可以看到,可以获取到最大相同子串,并且可以获取到多个最大子串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值