創建樹:(線索?)
讓在此樹的每個節點都有一個最大的26名兒童,每個字母(A-Z)的。
從根到葉的路徑表示一個字符串。
root
\
s
|
t
|
a
/\
c n
/|
k d
| |
o u
...
只需將所有項目添加到此樹中。
然後,用深度優先搜索處理樹,每當你得到一個只有1個樹葉的節點(你可以跟蹤這些計數)時,打印該字符串到目前爲止並遞增。所以在c
和n
將只有1葉,所以你會分別打印stac
和stan
。我不會說上面的方法特別適合於一個更大的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);
}
呃,據我所知,如果我沒有弄錯的話,我知道set只有UNIQUE元素。但我仍然不確定該怎麼做。 – user2041143 2013-02-21 19:49:10
誤讀了一下這個問題,你是對的,一套不是正確的結構。 – 2013-02-21 19:54:34
任何想法我該怎麼做?我完全陷入困境。 – user2041143 2013-02-21 20:04:47