我需要從C++中的一組文件名中計算出最長的公共子字符串。來自兩個以上字符串的最長公共子字符串 - C++
準確地說,我的std ::字符串的std ::列表(或相當於QT,也未嘗不可)
char const *x[] = {"FirstFileWord.xls", "SecondFileBlue.xls", "ThirdFileWhite.xls", "ForthFileGreen.xls"};
std::list<std::string> files(x, x + sizeof(x)/sizeof(*x));
我需要計算n的所有字符串的不同最長公共子,在這例如對於n = 2
"File" and ".xls"
如果我能計算出最長公共子,我可以把它剪它,並再次運行算法得到第二長的,所以實際上這歸結爲:
有用於計算std :: strings的std :: list的LCS的(引用?)實現?
這不是一個很好的答案,但一個骯髒的解決方案,我有 - 蠻力上的QList QUrls從中僅將部分最後一個「/」取。我很樂意用「適當的」代碼替換它。
(我發現http://www.icir.org/christian/libstree/ - ?這將有很大的幫助,但我不能得到它來編譯我的機器上有人用這個可能)
QString SubstringMatching::getMatchPattern(QList<QUrl> urls)
{
QString a;
int foundPosition = -1;
int foundLength = -1;
for (int i=urls.first().toString().lastIndexOf("/")+1; i<urls.first().toString().length(); i++)
{
bool hit=true;
int xj;
for (int j=0; j<urls.first().toString().length()-i+1; j++) // try to match from position i up to the end of the string :: test character at pos. (i+j)
{
if (!hit) break;
QString firstString = urls.first().toString().right(urls.first().toString().length()-i).left(j); // this needs to match all k strings
//qDebug() << "SEARCH " << firstString;
for (int k=1; k<urls.length(); k++) // test all other strings, k = test string number
{
if (!hit) break;
//qDebug() << " IN " << urls.at(k).toString().right(urls.at(k).toString().length() - urls.at(k).toString().lastIndexOf("/")+1);
//qDebug() << " RES " << urls.at(k).toString().indexOf(firstString, urls.at(k).toString().lastIndexOf("/")+1);
if (urls.at(k).toString().indexOf(firstString, urls.at(k).toString().lastIndexOf("/")+1)<0) {
xj = j;
//qDebug() << "HIT LENGTH " << xj-1 << " : " << firstString;
hit = false;
}
}
}
if (hit) xj = urls.first().toString().length()-i+1; // hit up to the end of the string
if ((xj-2)>foundLength) // have longer match than existing, j=1 is match length
{
foundPosition = i; // at the current position
foundLength = xj-1;
//qDebug() << "Found at " << i << " length " << foundLength;
}
}
a = urls.first().toString().right(urls.first().toString().length()-foundPosition).left(foundLength);
//qDebug() << a;
return a;
}
這可能有用。 http://stackoverflow.com/questions/2418504/algorithm-to-find-common-substring-across-n-strings –
我已經點擊了數百個類似的問題沒有找到答案,包括上面的和http:// stackoverflow.com/questions/10248728/how-to-find-longest-common-substring-using-c。我得到的最接近的是http://homepage.virgin.net/cdm.henderson/site/cpp/lcs/index.htm,但是這是爲了子序列,而不是子串。 – user2707001
這是一個不平凡的問題。詳盡的搜索是必要的。 (如果我的第一眼看好) –