1. 程式人生 > 程式設計 >Java青蛙跳臺階問題的解決思路與程式碼

Java青蛙跳臺階問題的解決思路與程式碼

技術標籤:Data Structure

題解

  1. 這題在輸入方面遇到了點問題。首先是沒說明單詞字串的個數,其次是各單詞字串間是以空格隔開,以回車結束所有單詞輸入,然後總的又要求多組測試資料。根據前面兩點,還是應該一個字元一個字元的讀取字串,遇到有效字元就加入串,遇到空格就跳到下一個串,遇到回車就進入本題的函式,遇到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; }