原文地址: http://blog.csdn.net/jianzhibeihang/archive/2009/12/11/4985276.aspx string lcs_search(string str1, string str2) { int length = 0; int end = 0; if (str1.length() < str2.length()) // 保证str1为母串(较长的哪个串) { string strTemp = str1; str1 = str2; str2 = strTemp; } int *sign = new int[str1.length()]; // sign里存储的是母串(str1)每个元素前向能与子串匹配的公共子串数 // 比如sign[12]==5;则说明从str1[12]往前(所以在第二个for循环中idx1的计数就是从str1的最后一个开始)5个元素(包括[12]), // 能与str2的某一段匹配 for (size_t idx2 = 0; idx2 < str2.length(); idx2++) { for (int idx1 = str1.length() - 1; idx1 >= 0; idx1--) { if (str2[idx2] == str1[idx1]) { if (idx2 == 0 || idx1 == 0) //idx2==0,则母串的idx1元素必然只能匹配一个,idx1==0同理 { sign[idx1] = 1; } else //由于该次idx1匹配,所以子串可以+1 { sign[idx1] = sign[idx1 - 1] + 1; } } else //不匹配,则此位置的sign归零 { sign[idx1] = 0; } if (sign[idx1] > length) //结果存储 { length = sign[idx1]; end = idx1; } } } delete[] sign; return str1.substr(end - length + 1, length); }