procedure lcs(s1,s2) # return longest common substring of s1 and s2 if *s1 > *s2 then s1 :=: s2 # s1 is the shorter string return s1 ? if j := *s1 to 1 by -1 & # Return substring, s, of s1 that is tab(1 to *s1) & # also a substring of s2. Evaluate s from find(s := move(j),s2) then s else "" # longest to shortest. end procedure main(A) lcstest("thisisatest","testing123testing") lcstest("abracadabra","arabracae") lcstest("abc","123") lcstest("testing","sting") lcstest("thisisatest_stinger","testing123testingthing") lcstest("thisisatest_stinger","thisis") lcstest("testing123testingthing","thisis") lcstest("thisisatest","thisisatest") end procedure lcstest(s1,s2) write("\"",s1,"\" and ","\"",s2,"\" --> \"",lcs(s1,s2),"\"") end