2013-02-21 154 views
-1

我正在學習C++並且在線處理一些挑戰。然而,似乎大部分「正常」挑戰我總是陷入困境。我不確定自己是否缺乏知識,或者只是過度認知。無論如何,如果有人能幫助我,我將不勝感激。C++中的字符串和索引

我想要做這個挑戰: 例如,我的輸入是一個數字「N」,之後我將不得不輸入「N」個字符串。

然後,我必須找到每個字符串typen的最小量的前綴,並確保它們不重複。例如,字符串「stackoverflow」有許多前綴:s,st,sta,stac,stack,stacko,stackov,stackove,stackover,stackoverf,stackoverfl,stackoverflo,stackoverflow。

所有這些都是stackoverflow的前綴。所以,如果我們有另一個字符串「standup」,我們必須輸入stackoverflow - stac,因爲已經存在stup,所以它將成爲standup的標準。

在此先感謝。

+0

呃,據我所知,如果我沒有弄錯的話,我知道set只有UNIQUE元素。但我仍然不確定該怎麼做。 – user2041143 2013-02-21 19:49:10

+0

誤讀了一下這個問題,你是對的,一套不是正確的結構。 – 2013-02-21 19:54:34

+0

任何想法我該怎麼做?我完全陷入困境。 – user2041143 2013-02-21 20:04:47

回答

0

創建樹:(線索?)

讓在此樹的每個節點都有一個最大的26名兒童,每個字母(A-Z)的。

從根到葉的路徑表示一個字符串。

 root 
      \ 
      s 
      | 
      t 
      | 
      a 
      /\ 
      c n 
     /| 
     k d 
     | | 
     o u 
     ... 

只需將所有項目添加到此樹中。

然後,用深度優先搜索處理樹,每當你得到一個只有1個樹葉的節點(你可以跟蹤這些計數)時,打印該字符串到目前爲止並遞增。所以在cn將只有1葉,所以你會分別打印stacstan。我不會說上面的方法特別適合於一個更大的C++程序員,但是這裏有一些代碼應該工作:(請原諒C和C++以及其他各種暴行在下面的災難性混合,這是隻是一個超級快速和骯髒的方法)

link

#include <string> 
#include <iostream> 
using namespace std; 

class Node 
{ 
    public: 
    int count; 
    Node *(children[26]); // array of pointers 
    Node() { count = 0; for (int i = 0; i < 26; i++) children[i] = NULL; }; 
}; 

void add(char *s, Node &n) 
{ 
    if (*s == 0) // null-terminator 
     return; 
    if (n.children[*s-'a'] == NULL) 
     n.children[*s-'a'] = new Node(); 
    n.count++; 
    add(s+1, *n.children[*s-'a']); 
} 

void print(char *start, char *end, Node &n) 
{ 
    if (n.count == 1) 
    { 
     *end = 0; // null-terminator 
     cout << start << endl; 
     return; 
    } 
    for (int i = 0; i < 26; i++) 
    { 
     if (n.children[i] != NULL) 
     { 
      *end = (char)(i+'a'); 
      print(start, end+1, *n.children[i]); 
     } 
    } 
} 

int main() 
{ 
    char *s = "stackoverflow"; 
    Node root; 
    add(s, root); 
    s = "standup"; 
    add(s, root); 
    char output[1000]; // big buffer 
    print(output, output, root); 
} 
+0

有趣的概念。除了這有點複雜。我對C++的瞭解有限。我也沒有做過很多挑戰,我所做的所有工作都基於數學,因此在閱讀文章後,它似乎超出了我的水平。 – user2041143 2013-02-21 20:22:04

+0

@ user2041143是的,這可能不是最簡單的方法。如果你想看看,我添加了一些代碼。代碼可能比需要的稍微複雜一些。 – Dukeling 2013-02-21 20:42:08

1

最簡單的版本,我能想到的;

  • 按字母順序排列單詞列表。將第二個到最後一個單詞的副本附加到列表中。

  • 對於列表中的每個單詞,其唯一前綴是與列表中的下一個單詞相比使其唯一的字母數。

一個例子,stackoverflowstandupseer

列表成爲;

seer 
stackoverflow 
standup 
stackoverflow 

seer only requires `se` to be unique as compared to `stackoverflow`. 
stackoverflow requires `stac` to be unique as compared to `standup`. 
standup requires `stan` to be unique as compared to `stackoverflow`. 

完成。

+0

如何按字母順序排列字符串? – user2041143 2013-02-21 20:21:08

+0

@ user2041143有一個示例如何使用'list :: sort' [here](http://www.cplusplus.com/reference/list/list/sort/)。 – 2013-02-21 20:24:07

+0

+1我可能已經推翻了一些東西。 – Dukeling 2013-02-21 20:57:57