Java青蛙跳臺階問題的解決思路與程式碼
阿新 • • 發佈:2020-12-21
技術標籤:Data Structure
題解
- 這題在輸入方面遇到了點問題。首先是沒說明單詞字串的個數,其次是各單詞字串間是以空格隔開,以回車結束所有單詞輸入,然後總的又要求多組測試資料。根據前面兩點,還是應該一個字元一個字元的讀取字串,遇到有效字元就加入串,遇到空格就跳到下一個串,遇到回車就進入本題的函式,遇到eof就退出。
題目
問題 E: Trie樹
時間限制: 1 Sec 記憶體限制: 128 MB
提交: 4 解決: 3
[提交][狀態][討論版]
題目描述
Trie樹又稱單詞查詢樹,是一種樹形結構,如下圖所示。
它是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。
輸入的一組單詞,建立Trie樹。輸入字串,計算以該字串為公共字首的單詞數。
(提示:樹結點有26 個指標,指向單詞的下一字母結點。)
輸入
測試資料有多組
每組測試資料格式為:
第一行:一行單詞,單詞全小寫字母,且單詞不會重複,單詞的長度不超過10
第二行:測試公共字首字串數量t
後跟t行,每行一個字串
輸出
每組測試資料輸出格式為:
第一行:建立的Trie樹的層次遍歷結果
第2~t+1行:對每行字串,輸出樹中以該字串為公共字首的單詞數。
樣例輸入
abcd abd bcd efg hig
3
ab
bc
abcde
樣例輸出
abehbcficddggd
2
1
0
程式碼塊
#include <iostream>
#include <queue>
using namespace std;
class TreeNode
{
char data;
TreeNode *child[26];
public:
TreeNode();
friend class TrieTree;
};
class TrieTree
{
private:
TreeNode *root;
public:
TrieTree();
~TrieTree();
void CreateTree(int num, string *s);
void BFSTraverse();
void Index (int n);
};
TreeNode::TreeNode()
{
for(int i=0; i<26; i++)
child[i] = NULL;
}
TrieTree::TrieTree()
{
root = new TreeNode;
}
TrieTree::~TrieTree()
{
delete root;
}
void TrieTree::CreateTree(int num, string *s)
{
int i, k;
TreeNode *p, *q;
for(k=0; k<num; k++)
{
q = root;
int len = s[k].length();
for(i=0; i<len; i++)
{
if(!q->child[s[k][i]-97])
{
p = new TreeNode;
p->data = s[k][i];
q->child[s[k][i]-97] = p;
q = p;
}
else
q = q->child[s[k][i]-97];
}
}
}
void TrieTree::BFSTraverse()
{
TreeNode *p;
queue<TreeNode *> Q;
Q.push(root);
while(!Q.empty())
{
p = Q.front();
Q.pop();
for(int i=0; i<26; i++)
{
if(p->child[i])
{
Q.push(p->child[i]);
cout<<p->child[i]->data;
}
}
}
cout<<endl;
}
void TrieTree::Index(int n)
{
int i, j;
for(i=0; i<n; i++)
{
string s;
cin>>s;
TreeNode *p = root;
int count = 0;
int len = s.length();
for(j=0; j<len; j++)
{
if(p->child[s[j]-97])
p = p->child[s[j]-97];
else
{
cout<<0<<endl;
break;
}
}
if(j==len)
{
queue<TreeNode *> Q;
Q.push(p);
while(!Q.empty())
{
TreeNode *q;
q = Q.front();
Q.pop();
int pos = 0;
for(int k=0; k<26; k++)
{
if(q->child[k])
{
Q.push(q->child[k]);
pos = 1;
}
}
if(!pos)
count++;
}
cout<<count<<endl;
}
}
getchar();
}
int main(void)
{
char ch;
int num = 0;
string s[1000];
while((ch = getchar())!=EOF)
{
if(ch=='\n')
{
num++;
TrieTree myTree;
myTree.CreateTree(num, s);
myTree.BFSTraverse();
int n;
cin>>n;
myTree.Index(n);
for(int i=0; i<num; i++)
s[i] = {"\0"};//函式結束了注意將string和num清0
num = 0;
}
else if(ch==' ')
num++;
else
s[num] += ch;
}
return 0;
}