Azar.099
شنبه 26 اردیبهشت 1394, 17:34 عصر
سلام
من یک سری کلمه در اختیارم قرار میگیره (یعنی یک سری کلمه به عنوان منبع خواهم داشت ) و یک سری کلمه دیگر هم بهم داده میشه که باید تعداد کلماتی از منبعم را که این قافیه ها را دارند پیدا بکنم .
به بیان ساده تر وقتی میگه داخل کلمات منبع کلمه ها با قافیه x را پیدا کن من باید کلمه هایی مثل xy را پیدا بکنم که طول y بیش از 5 نباشه .
من از درخت ترای میخوام استفاده بکنم برای ذخیره کلمات منبع
حالا برای پیدا کردن قافیه ها دچار مشکل شدم و نمیدونم باید چجوری این قافیه ها را پیدا بکنم داخل درخت
چون سرچ داخل درخت هم از ریشه هست .
شما ایده ای ندارید ؟
این درخت ترای :
#include <iostream>#include <vector>
using namespace std;
class Node {
public:
Node() { mContent = ' '; mMarker = false; }
~Node() {}
char content() { return mContent; }
void setContent(char c) { mContent = c; }
bool wordMarker() { return mMarker; }
void setWordMarker() { mMarker = true; }
Node* findChild(char c);
void appendChild(Node* child) { mChildren.push_back(child); }
vector<Node*> children() { return mChildren; }
private:
char mContent;
bool mMarker;
vector<Node*> mChildren;
};
class Trie {
public:
Trie();
~Trie();
void addWord(string s);
bool searchWord(string s);
//void deleteWord(string s);
private:
Node* root;
};
Node* Node::findChild(char c)
{
for (int i = 0; i < mChildren.size(); i++)
{
Node* tmp = mChildren.at(i);
if (tmp->content() == c)
{
return tmp;
}
}
return NULL;
}
Trie::Trie()
{
root = new Node();
}
Trie::~Trie()
{
// Free memory
}
void Trie::addWord(string s)
{
Node* current = root;
if (s.length() == 0)
{
current->setWordMarker(); // an empty word
return;
}
for (int i = 0; i < s.length(); i++)
{
Node* child = current->findChild(s[i]);
if (child != NULL)
{
current = child;
}
else
{
Node* tmp = new Node();
tmp->setContent(s[i]);
current->appendChild(tmp);
current = tmp;
}
if (i == s.length() - 1)
current->setWordMarker();
}
}
bool Trie::searchWord(string s)
{
Node* current = root;
while (current != NULL)
{
for (int i = 0; i < s.length(); i++)
{
Node* tmp = current->findChild(s[i]);
if (tmp == NULL)
return false;
current = tmp;
}
if (current->wordMarker())
return true;
else
return false;
}
return false;
}
من یک سری کلمه در اختیارم قرار میگیره (یعنی یک سری کلمه به عنوان منبع خواهم داشت ) و یک سری کلمه دیگر هم بهم داده میشه که باید تعداد کلماتی از منبعم را که این قافیه ها را دارند پیدا بکنم .
به بیان ساده تر وقتی میگه داخل کلمات منبع کلمه ها با قافیه x را پیدا کن من باید کلمه هایی مثل xy را پیدا بکنم که طول y بیش از 5 نباشه .
من از درخت ترای میخوام استفاده بکنم برای ذخیره کلمات منبع
حالا برای پیدا کردن قافیه ها دچار مشکل شدم و نمیدونم باید چجوری این قافیه ها را پیدا بکنم داخل درخت
چون سرچ داخل درخت هم از ریشه هست .
شما ایده ای ندارید ؟
این درخت ترای :
#include <iostream>#include <vector>
using namespace std;
class Node {
public:
Node() { mContent = ' '; mMarker = false; }
~Node() {}
char content() { return mContent; }
void setContent(char c) { mContent = c; }
bool wordMarker() { return mMarker; }
void setWordMarker() { mMarker = true; }
Node* findChild(char c);
void appendChild(Node* child) { mChildren.push_back(child); }
vector<Node*> children() { return mChildren; }
private:
char mContent;
bool mMarker;
vector<Node*> mChildren;
};
class Trie {
public:
Trie();
~Trie();
void addWord(string s);
bool searchWord(string s);
//void deleteWord(string s);
private:
Node* root;
};
Node* Node::findChild(char c)
{
for (int i = 0; i < mChildren.size(); i++)
{
Node* tmp = mChildren.at(i);
if (tmp->content() == c)
{
return tmp;
}
}
return NULL;
}
Trie::Trie()
{
root = new Node();
}
Trie::~Trie()
{
// Free memory
}
void Trie::addWord(string s)
{
Node* current = root;
if (s.length() == 0)
{
current->setWordMarker(); // an empty word
return;
}
for (int i = 0; i < s.length(); i++)
{
Node* child = current->findChild(s[i]);
if (child != NULL)
{
current = child;
}
else
{
Node* tmp = new Node();
tmp->setContent(s[i]);
current->appendChild(tmp);
current = tmp;
}
if (i == s.length() - 1)
current->setWordMarker();
}
}
bool Trie::searchWord(string s)
{
Node* current = root;
while (current != NULL)
{
for (int i = 0; i < s.length(); i++)
{
Node* tmp = current->findChild(s[i]);
if (tmp == NULL)
return false;
current = tmp;
}
if (current->wordMarker())
return true;
else
return false;
}
return false;
}