java最长公共子串_查找字符串最长公共子串

import java.util.*;

/**

* 请编码实现一个命令行工具,找出指定的2个字符串的最长公共子串。

* Create by DbL on 2020/1/9

*/

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

in.useDelimiter("\n");

String str = in.next();

findCommonString(str);

}

/**

* 命令行工具接收两个字符串参数。输入字符串的合法字符集为[a-zA-Z0-9],大小写敏感,无需考虑异常输入场景。

* 所找到的公共子串;如果存在多个等长的公共子串,则请按字母序排序,依次打印出所有公共子串,每行一个。

* 例:输入 1234567 12893457

*     输出 345

* @param str

*/

public static void findCommonString(String str){

//将输入的字符串以空格拆分成两个字符串

String[] strs = str.split(" ");

// 因无需考虑异常输入场景 直接取出下标为0和1的字符串

String str1 = strs[0];

String str2 = strs[1];

// 对得到的第一个字符串按长度进行拆分  并放到一个字符串集合里面

// 创建一个字符串集合用来存储第一个字符串能拆分的所有情况

List list_str1 = new ArrayList();

// 外层循环表示字符串长度

for (int i = 1; i 

// 内层循环表示截取开始下标

for (int j = 0; j 

list_str1.add(str1.substring(j,j+i));

}

}

// 将list中的字符串与str2进行比较

// 新建一个数组用来存放公共子串最长的值

String[] maxStrs = new String[0];

for (int i = 0; i 

String substr = list_str1.get(i);

if(str2.contains(substr)){

// 如果maxStrs有值 取出第一个值的长度与当前字符串做对比,

// 如果比数组内字符串长度长则清空原来的数组将当前字符串存入

if(maxStrs.length>0 ){

if(maxStrs[0].length()

maxStrs = new String[0];

maxStrs = Arrays.copyOf(maxStrs,maxStrs.length+1);

maxStrs[maxStrs.length-1] = substr;

}

if(maxStrs[0].length()==substr.length()){

maxStrs = Arrays.copyOf(maxStrs,maxStrs.length+1);

maxStrs[maxStrs.length-1] = substr;

}

}else {

maxStrs = Arrays.copyOf(maxStrs,maxStrs.length+1);

maxStrs[maxStrs.length-1] = substr;

}

}

}

// 对数组进行去重操作,利用Set集合的不可重复性

Set set = new HashSet();

for(int i=0;i

set.add(maxStrs[i]);

}

Object[] finalStrs1 = set.toArray();

// 对最后得到的数组进行排序

Arrays.sort(finalStrs1);

// 输出结果

for (int i = 0; i 

System.out.println(finalStrs1[i]);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值