华为OD机试-找出重复代码-2022Q4 A卷-Py/Java/JS

小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。重复代码查找方法:以字符串形式给出两行代码(字符审长度1< length < 100,由英文字母、数字和空格组成),找出两行代码中的最长公共子串
注:如果不存在公共子串,返回空字符串
输入描述
输入的参数 text1,text2 分别表示两行代码
输出描述
输出任一最长公共子串
示例一
输入
hello123world1
hello123abc4
输出
hello123

示例二
输入
private_void_method

public_void_method
输出
_void_method
示例三
输入
hiworld
hiweb
输出
hiw

Java 代码

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
import java.math.BigInteger;
 
class Main {
	public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        String str1 = in.nextLine();
        String str2 = in.nextLine();
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        int[][] dp = new int[s1.length + 1][s2.length + 1];
        int maxLen = 0;
        int lastPos = 0;
        for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (s1[i] == s2[j]) {
                    dp[i + 1][j + 1] = dp[i][j] + 1;
                    //如果有更长的公共子串,更新长度
                    if (dp[i + 1][j + 1] > maxLen) {
                        maxLen = dp[i + 1][j + 1];
                        lastPos = i;
                    }
                }
            }
        }
        if (maxLen == 0) {
            System.out.println("");
        } else {
           System.out.println(str1.substring(lastPos - maxLen + 1, lastPos + 1));
        }
  }
}

Python代码

import functools
import sys
from collections import Counter, defaultdict
import copy
from itertools import permutations
import re
import math
import sys
 
def find_lcsubstr(s1, s2): 
    # 生成0矩阵,为方便后续计算,比字符串长度多了一列
    dp = [[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)] 
    max_length = 0   # 最长匹配的长度
    p = 0  # 最长匹配对应在s1中的最后一位
    for i in range(len(s1)):
        for j in range(len(s2)):
            if s1[i] == s2[j]:
                dp[i+1][j+1] = dp[i][j] + 1
                if dp[i+1][j+1] > max_length:
                    max_length = dp[i+1][j+1]
                    p = i+1
    return s1[p-max_length:p]   # 返回最长子串
 
str1 = input()
str2 = input()
print(find_lcsubstr(str1, str2))

JS代码

function main(s1, s2) {
    // 生成0矩阵,为方便后续计算,比字符串长度多了一列
    let dp = new Array(s1.length+1)
    for (let i=0;i max_length) {
                    max_length = dp[i+1][j+1]
                    p = i+1
                }
            }
        }
    } 
    // 返回最长子串
    console.log(s1.substr(p-max_length, p))
}
 
 
main("private_void_method","public_void_method")

你可能感兴趣的:(java,javascript,华为,python)