你提到你當前的代碼太慢,當輸入字符串長度很大。如果你可以提供一個具體的例子以及你的時間信息,那麼我們會知道你認爲「太慢」了。您還應該指定您認爲可以接受的運行時間。這裏有一個例子:
我將從一個初始版本開始,我認爲它與您當前的算法類似。它生成> = 2長度的所有子序列:
#include <iostream>
#include <string>
void subsequences(const std::string& prefix, const std::string& suffix)
{
if (prefix.length() >= 2)
std::cout << prefix << std::endl;
for (size_t i=0; i < suffix.length(); ++i)
subsequences(prefix + suffix[i], suffix.substr(i + 1));
}
int main(int argc, char* argv[])
{
subsequences("", "ABCD");
}
運行該程序產生以下輸出:
AB
ABC
ABCD
ABD
AC
ACD
AD
BC
BCD
BD
CD
現在,讓我們將輸入字符串更改爲更長的時間。我將使用26個字符的輸入字符串:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
這會生成67,108,837個子序列。我不會在這裏列出他們:-)。在我的機器上,上面顯示的代碼用26個字符的輸入字符串運行只需78秒以上(不包括輸出到cout)。
當我尋找優化上述代碼的方法時,跳出的一件事就是它爲子序列()的每次遞歸調用創建兩個新的字符串對象。如果我們可以預先分配一次空間然後傳遞指針呢?版本2:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void subsequences(char* prefix, int prefixLength, const char* suffix)
{
if (prefixLength >= 2)
printf("%s\n", prefix);
for (size_t i=0; i < strlen(suffix); ++i) {
prefix[prefixLength] = suffix[i];
prefix[prefixLength + 1] = '\0';
subsequences(prefix, prefixLength + 1, suffix + i + 1);
}
}
int main(int argc, char* argv[])
{
const char *inputString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *prefix = (char*) _malloca(strlen(inputString) + 1);
subsequences(prefix, 0, inputString);
}
這產生相同的67108837子序列,但執行時間是現在剛剛超過2秒(再次,通過printf的不含輸出)。
爲什麼不使用std :: string :: substr? – ForEveR 2012-08-03 18:46:37
我需要找到個子不串.... 爲ABCD - > - > ABC,ABD,AD,BD – user1413523 2012-08-03 18:58:49
哪裏是 'n' 和 'S []' 聲明? – cbranch 2012-08-03 19:08:39