package main import ( "fmt" ) func main() { var str1 string var str2 string for { n, _ := fmt.Scan(&str1, &str2) if n == 0 { break } else { str := process(str1, str2) if len(str) > 0 { fmt.Println(str) } else { fmt.Println(-1) } } } } // o(1)复杂度带分析 // 空间复杂度为 o(n) 时间复杂度为 o(n*m) func process(str1 string, str2 string) string { dp := make([]int, len(str2)+1) maxi, maxl := 0, 0 for i:=1; i<len(str1)+1; i++ { for j:=len(dp)-1; j>=1; j-- { if str1[i-1] == str2[j-1] { dp[j] = dp[j-1]+1 if dp[j] > maxl { maxl = dp[j] maxi = i } } else { dp[j] = 0 // 需要复原为0 } } } if maxl > 0 { return str1[maxi-maxl:maxi] } return "" } // 空间复杂度为 o(n*m) 时间复杂度为 o(n*m) // func process(str1 string, str2 string) string { // dp := make([][]int, len(str1)+1) // for i:=0; i<len(dp); i++ { // dp[i] = make([]int, len(str2)+1) // } // maxi, maxl := 0, 0 // for i:=1; i<len(dp); i++ { // for j:=1; j<len(dp[i]); j++ { // if str1[i-1] == str2[j-1] { // dp[i][j] = dp[i-1][j-1]+1 // if dp[i][j] > maxl { // maxl = dp[i][j] // maxi = i // } // } // } // } // if maxl > 0 { // return str1[maxi-maxl:maxi] // } // return "" // }