我建立一個以電話號碼作爲輸入的程序。然後它應該檢查在我們的新號碼中是否已經存在一個電話號碼,這是一個前綴。 例如:Trie,電話號碼的前綴
Input:
555 //This is okay
5556888 //This is not okay because 555 is a registered number
556888 //this is okay
5568889 // Not okay
希望你明白我在做什麼。
我已經實現了兩個功能:
包含 如果數量或前綴已經存在,那應該檢查。
bool PrefixStringSet::contains(string s)
{
NodePtr temp = root;
for (int i = 0; i < s.size(); i++)
{
if(temp->children[s[i] - '0'] == NULL)
{
return false;
}
temp = temp->children[s[i] - '0'];
}
return true;
}
插入
bool PrefixStringSet::insert(string s)
{
if(contains(s) == true)
{
return false;
}
NodePtr temp = root;
for (int i = 0; i < s.size(); i++)
{
int number = (int)s[i] - (int)'0';
if(temp->children[number] == NULL)
{
temp->children[number] = new TrieNode;
temp = temp->children[number];
}
}
return true;
}
,因爲它代表現在只包含檢查的,如果號已被註冊。我找不出一個好方法來檢查前綴是否已經是一個數字。 我應該實現它在包含或可能在插入功能(也許有一個循環去槽每個前綴,從第一個數字開始?)
任何幫助表示讚賞。
主要
int main()
{
PrefixStringSet Phonenumber;
int HowManyPhoneNumbers;
cin >> HowManyPhoneNumbers;
for(int i = 0 ; i<HowManyPhoneNumbers ; i++)
{
string temp;
cin >> temp;
if(Phonenumber.insert(temp) == true)
{
cout << "Yes" << endl;
}
else
{
cout << "NO" <<endl;
}
}
return 0;
}
編輯 插入:
bool PrefixStringSet::insert(string s)
{
if(contains(s) == true)
{
return false;
}
NodePtr temp = root;
for (int i = 0; i < s.size(); i++)
{
int number = (int)s[i] - (int)'0';
if(temp->children[number] == NULL)
{
temp->children[number] = new TrieNode;
}
temp = temp->children[number];
}
return true;
}
Contains:
bool PrefixStringSet::contains(string s)
{
NodePtr temp = root;
for (int i = 0; i < s.size(); i++)
{
if(temp->is_leaf())
{
return false;
}
if(temp->children[s[i] - '0'] == NULL)
{
return false;
}
temp = temp->children[s[i] - '0'];
}
return true;
}
input:
911
YES
9111 /Not working
Yes
91 //Working
NO
EDIT2:
bool PrefixStringSet::contains(string s)
{
NodePtr temp = root;
for (int i = 0; i < s.size(); i++)
{
if(temp->is_leaf())
{
return false;
}
if (temp !=root && temp->is_leaf())
{
return true;
}
if(temp->children[s[i] - '0'] == NULL)
{
return false;
}
temp = temp->children[s[i] - '0'];
}
return true;
}
通常像這樣的方法的簽名是'const string&s',以避免必須複製字符串以便在函數中使用。 – tadman
我不確定爲什麼你要經歷所有計算trie(作業?)的麻煩,因爲一個簡單的['std :: set'](http://en.cppreference.com/w/cpp/container/set)允許的前綴將會快很多。 – tadman
是的,這是作業 – user3265963