查找2个字符串的最大公共字串,可以不连续,但顺序不变。如 彩票 七星彩 typedef enum { up = 1, leftd, leftup } Direct; string lcs(string& t1,string& t2) { string res; int s1 = t1.size(); int s2 = t2.size(); int m = s1+1; int n = s2 + 1; // init temp M*N array for length int **commons = new int*[m]; int **direction = new int*[m]; for (int i = 0; i < m; i++) { commons[i] = new int[n]; direction[i] = new int[n]; } //int commons[10][10]; //int direction[10][10]; for (int i = 0; i < m; i++) { commons[i][0] = 0; direction[i][0] = 0; } for (int i = 0; i < n; i++) { commons[0][i] = 0; direction[0][i] = 0; } /* for (int i =0; i<m; i++) { for (int j = 0; j<n; j++) { commons[i][j]=0; direction[i][j] = 0; } }*/ // find LCS for (int i=1; i<m; i++) { for (int j=1; j<n; j++) { if (t1[i-1] == t2[j-1]) { commons[i][j] = commons[i-1][j-1] + 1; direction[i][j] = leftup; } else if (commons[i-1][j] >= commons[i][j-1]) { commons[i][j] = commons[i-1][j]; direction[i][j] = up; } else { commons[i][j] = commons[i][j-1]; direction[i][j] = leftd; } } } // output temp array for (int i = 0; i<m; i++) { for (int j = 0; j<n; j++) { cout << commons[i][j] << ","; } cout << endl; } int max = commons[s1][s2]; int i,j; /* // return all LCS, maybe duplicated for (int l = s1-1; l > 0; l--) { res =""; if (commons[l][s2] >= max) { i = l, j = s2; while (commons[i][j]) { switch (direction[i][j]) { case leftup: res = t1[i-1] + res; i--; j--; break; case leftd: j--; break; case up: i--; break; default: break; } } cout << endl <<res <<endl; } } for (int c = s2; c > 0; c--) { res = ""; if (commons[s1][c] >= max) { i = s1, j = c; while (commons[i][j]) { switch (direction[i][j]) { case leftup: res = t1[i-1] + res; i--; j--; break; case leftd: j--; break; case up: i--; break; default: break; } } cout << endl <<res <<endl; } } */ // return 1 of LCS i= s1, j=s2; while (commons[i][j]) { switch (direction[i][j]) { case leftup: res = t1[i-1] + res; i--; j--; break; case leftd: j--; break; case up: i--; break; default: break; } } // delete array for (int i = 0; i < m; i++) { delete []commons[i]; delete []direction[i]; } delete [] commons; delete [] direction; return res; } void t_lcs() { string s1("abcbdab"); string s2("bdcaba"); string r = lcs(s1, s2); cout<<endl<<"LCS:"<<r<<endl; } 动态规划 实现