Java求两个字符串的最长公共子串,这个是华为OJ上的一道题目。首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下:
(1)一定不可以有包名;
(2)主类名只能为Main;
(3)不可以输出与结果无关的信息。
好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java代码的书写规则):
import java.util.Scanner;
public class Main {
? ? public static void main(String[] args) {
? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? Main mainObj = new Main();
? ? ? ? int len = mainObj.getCommonStrLength(sc.next(),sc.next());
? ? ? ? System.out.println(len);
? ? }
? ?
? ? int getCommonStrLength(String str1, String str2) {
? ? ? ? ? ? str1 = str1.toLowerCase();?
? ? ? ? ? ? str2 = str2.toLowerCase();?
? ? ? ? ? ? int len1 = str1.length();?
? ? ? ? ? ? int len2 = str2.length();?
? ? ? ? ? ? String min = null;?
? ? ? ? ? ? String max = null;?
? ? ? ? ? ? String target = null;
? ? ? ? ? ? min = len1 <= len2 ? str1 : str2;
? ? ? ? ? ? max = len1 >? len2 ? str1 : str2;
? ? ? ? ? ? //最外层:min子串的长度,从最大长度开始
? ? ? ? ? ? for (int i = min.length(); i >= 1; i--) {
? ? ? ? ? ? ? ? //遍历长度为i的min子串,从0开始
? ? ? ? ? ? ? ? for (int j = 0; j <= min.length() - i; j++) {?
? ? ? ? ? ? ? ? ? ? target = min.substring(j, j + i);?
? ? ? ? ? ? ? ? ? ? //遍历长度为i的max子串,判断是否与target子串相同,从0开始
? ? ? ? ? ? ? ? ? ? for (int k = 0; k <= max.length() - i; k++) {?
? ? ? ? ? ? ? ? ? ? ? ? if (max.substring(k,k + i).equals(target)) {?
? ? ? ? ? ? ? ? ? ? ? ? ? ? return i;?
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }?
? ? ? ? ? ? return 0;?
? ? }
}