照舊,先上下個人暴力破解法:ios
#include <iostream> #include <string> #include <algorithm> using namespace std; string ToLower(string ss) { string::iterator itr; for(itr=ss.begin();itr!=ss.end();itr++) { *itr=tolower(*itr); } return ss; } int getCommonStrLength(string pFirstStr,string pSecondStr) { int firstLen=pFirstStr.length(); int secondLen=pSecondStr.length(); int countMax=0; for(int f=0;f<firstLen;f++) { int fCurrent=f; for(int s=0;s<secondLen;s++) { int tempCount=0; int sCurrent=s; while(sCurrent<secondLen&&fCurrent<firstLen&&pFirstStr[fCurrent]==pSecondStr[sCurrent]) { ++tempCount; ++fCurrent; ++sCurrent; } if(tempCount>countMax) countMax=tempCount; } } return countMax; } int main() { string fStr; string sStr; cin>>fStr>>sStr; fStr=ToLower(fStr); sStr=ToLower(sStr); cout<<getCommonStrLength(fStr,sStr)<<endl; }
兩個for循環是必須的,可是第二層的for循環內的while就明顯是進行了不少重複的操做比較。得改!那就是要記錄以前作過的記錄,考慮用動態規劃思想進行。算法
其實我開始的時候打算用後綴數組進行比較,但沒思路。就沒進行下去了。最後,在網上搜了下,有一種思路是利用前綴數組進行LCS算法。用一個二維數組Sub[firstLen][SecondLen]記錄公共字符串,即Sub[m][n]記錄的是第一個字符串第m位開始於第二個字符串第n位開始具備的公共字符串。那麼,在比較Sub[m+1][n+1]時,咱們只須要判斷FirstStr[m+1],SecondStr[n+1]便可,若是他們相同,那麼就能夠利用以前Sub[m][n]的記錄,由於第一個字符串從m+1往前,m位之前的以前已經比較過了;同理,第二個字符串從n+1開始,n位以前的已經比較過了,因此Sub[m+1][n+1]=Sub[m][n]+FirstStr[m+1]。數組
代碼:spa
http://blog.csdn.net/liufeng_king/article/details/8528858.net
// CPPPRO.cpp : 定義控制檯應用程序的入口點。 //3m6 最長公共子串,動態規劃實現 #include "stdafx.h" #include <iostream> #include <string> using namespace std; string getLCSLength(string &s, string &t); int main() { string s,t; cout<<"請輸入字符串s:"<<endl; cin>>s; cout<<"請輸入字符串t:"<<endl; cin>>t; cout<<"最長公共子串爲:"<<endl; cout<<getLCSLength(s,t)<<endl; return 0; } string getLCSLength(string &s, string &t) { int p = s.length(); int q = t.length(); string **num = new string *[p]; for(int i=0;i<p;i++) { num[i] = new string[q]; } char char1 = '\0'; char char2 = '\0'; int len = 0; string lcs = "" ; for(int i=0; i<p; i++) { for (int j=0; j<t.length(); j++) { char1 = s.at(i); char2 = t.at(j); if(char1!=char2) { num[i][j] = "" ; } else { if (i==0||j==0) { num[i][j]=char1; } else { num[i][j]=num[i-1][j-1]+char1; } if(num[i][j].length()>len) { len = num[i][j].length() ; lcs = num[i][j]; } else if(num[i][j].length()==len) { lcs = lcs + "," + num[i][j]; } } } } for(int i=0;i<p;i++) { delete[] num[i]; } delete[] num; return lcs; }