use DP in longestCommonSubstring

Used the dynamic programming approach to reduce the complexity of longestCommonSubstring to O(mn) from O(mn^2).
I would say to have a map from tuple: `Map[(Int, Int), A]`.