中级农民
- 积分
- 133
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2011-3-5
- 最后登录
- 1970-1-1
|
本帖最后由 Imbalism 于 2011-4-20 21:03 编辑
我的代码, 方法如上:- #include <iostream>
- #include <map>
- #include <string>
- using namespace std;
- class Trie
- {
- public:
- Trie(string s){count = 0; visited = false; value = s;};
- void insert(string s, int k)
- {
- if(s != value)
- {
- if(sons.find(s[k]) == sons.end())
- sons[s[k]] = new Trie(value + s[k]);
- sons[s[k]]->insert(s, k + 1);
- }
- if(!visited)
- {
- count ++;
- visited = true;
- }
- }
- void unVisit()
- {
- visited =false;
- map<char, Trie*>::iterator iter;
- for(iter = sons.begin(); iter != sons.end(); iter++)
- iter->second->unVisit();
- }
- void findResult(int l, int k, int& maxCount, string& maxString)
- {
- if(l == count && k >= maxCount)
- {
- maxCount = k;
- maxString = value;
- }
- map<char, Trie*>::iterator iter;
- for(iter = sons.begin(); iter != sons.end(); iter++)
- iter->second->findResult(l, k + 1, maxCount, maxString);
- }
- ~Trie()
- {
- map<char, Trie*>::iterator iter;
- for(iter = sons.begin(); iter != sons.end(); iter++)
- delete iter->second;
- }private:
- int count;
- bool visited;
- string value;
- map<char, Trie*> sons;
- };
- int main(int argc, char *argv[])
- {
- string s[] = {"abcd", "bcde", "sbbcdd", "vbcx"};
- Trie t("");
- for(int i = 0; i < 4; i++)
- {
- for(int j = 0; j < s[i].size(); j++)
- t.insert(s[i].substr(j, s[i].size() - j), 0);
- t.unVisit();
- }
- string maxString;
- int maxCount = 0;
- t.findResult(3, 0, maxCount, maxString);
- cout << maxString << endl;
- return 0;
- }
复制代码 |
|