2015-06-11 26 views
0

我試圖生成所有子串,並將其存儲在動態分配的字符串數組,如下所示:生成子串

cin>>N; 
    string str; 
    cin>>str; 
    ll m=N*(N+1)/2; 
    string *sub = new string[m]; 
    int k=0; 
    for(int i=1,k=0; i<=N; i++,k++) 
    { 
     for(int j=0; j+i<=N; j++,k++) 
     { 
     sub[k]=str.substr(j,i); 
     cout<<sub[k]<<' '; 
     } 
    } 

但產生所有串高達大小後的下面的代碼給出錯誤3

但當而不是存儲在字符串我打印所有的子字符串代碼提供所需的輸出。(按下面的代碼)

cin>>N; 
    string str; 
    cin>>str; 
    ll m=N*(N+1)/2; 
    string *sub = new string[m]; 
    int k=0; 
    for(int i=1,k=0; i<=N; i++,k++) 
    { 
     for(int j=0; j+i<=N; j++,k++) 
     { 
     cout<<str.substr(j,i); 
     } 
    } 

請幫助?

+2

請避免新的std :: string和查詢的std :: string :: SUBSTR –

+0

'字符串*分=新的字符串[M]。 '=>'std :: vector sub(m);' –

回答

0

你的k太多遞增:

for(int i=1,k=0; i<=N; i++,k++) // <== 
{ 
    for(int j=0; j+i<=N; j++,k++) 
    { 

你只是想增加k每次你講一下你的陣列,只發生在內環。原來,你在每個主循環中都做了額外的增量,所以你正在走出陣列的末端。

爲了避免這個問題,你可以做:

std::vector<std::string> subs; 
subs.reserve(m); 
for (int i=1; i<=N; ++i) { 
    for (int j=0; i+j<=N; ++j) { 
     subs.push_back(str.substr(j, i)); 
    } 
} 
+0

Thanx的幫助,我剛剛開始編碼,所以我不知道矢量,但我會嘗試去了解它。再次感謝 –