From 745fa3d92da52b2f1d5f9fd1d75925a0f310c29c Mon Sep 17 00:00:00 2001 From: Madhan Murugan <91775905+Capt-Madhan@users.noreply.github.com> Date: Fri, 8 Oct 2021 00:19:30 +0530 Subject: [PATCH] chore(Java): added longest common substring (#509) Co-authored-by: Ming Tsai <37890026+ming-tsai@users.noreply.github.com> --- algorithms/Java/README.md | 3 +- .../strings/Longest_common_substring.java | 68 +++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 algorithms/Java/strings/Longest_common_substring.java diff --git a/algorithms/Java/README.md b/algorithms/Java/README.md index 63dc1929..ef6ac06f 100644 --- a/algorithms/Java/README.md +++ b/algorithms/Java/README.md @@ -76,7 +76,8 @@ 5. [Split String](strings/SplitString.java) 6. [Tokenizer](strings/tokenizer.java) 7. [Anagram](strings/anagram.java) -8. [Boyer Moore Search](strings/Boyer_Moore.java) +8. [Longest Common Substring](strings/Longest_common_substring.java) +9. [Boyer Moore Search](strings/Boyer_Moore.java) ## Trees diff --git a/algorithms/Java/strings/Longest_common_substring.java b/algorithms/Java/strings/Longest_common_substring.java new file mode 100644 index 00000000..04bfc00e --- /dev/null +++ b/algorithms/Java/strings/Longest_common_substring.java @@ -0,0 +1,68 @@ +// Java implementation of +// finding length of longest +// Common substring using +// Dynamic Programming +class GFG { + /* + Returns length of longest common substring + of X[0..m-1] and Y[0..n-1] + */ + static int LCSubStr(char X[], char Y[], int m, int n) + { + // Create a table to store + // lengths of longest common + // suffixes of substrings. + // Note that LCSuff[i][j] + // contains length of longest + // common suffix of + // X[0..i-1] and Y[0..j-1]. + // The first row and first + // column entries have no + // logical meaning, they are + // used only for simplicity of program + int LCStuff[][] = new int[m + 1][n + 1]; + + // To store length of the longest + // common substring + int result = 0; + + // Following steps build + // LCSuff[m+1][n+1] in bottom up fashion + for (int i = 0; i <= m; i++) + { + for (int j = 0; j <= n; j++) + { + if (i == 0 || j == 0) + LCStuff[i][j] = 0; + else if (X[i - 1] == Y[j - 1]) + { + LCStuff[i][j] = LCStuff[i - 1][j - 1] + 1; + result = Integer.max(result, LCStuff[i][j]); + } + else + LCStuff[i][j] = 0; + } + } + return result; + } + + // Driver Code + public static void main(String[] args) + { + // Test 1: + String X = "abcdabaabbacd"; + String Y = "abbabaabcabcd"; + int m = X.length(); + int n = Y.length(); + System.out.println(LCSubStr(X.toCharArray(), Y.toCharArray(), m, n)); + + // Test 2: + String X = "abcdefgh"; + String Y = "abaabcfg"; + int m = X.length(); + int n = Y.length(); + System.out.println(LCSubStr(X.toCharArray(), Y.toCharArray(), m, n)); + } +} +// Time Complexity -> O(m*n) +// where m and n are the lengths of the strings X and Y.