美团--最小唯一前缀
生活随笔
收集整理的這篇文章主要介紹了
美团--最小唯一前缀
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
美團–最小唯一前綴
文章目錄
- 美團--最小唯一前綴
- 一、問題描述
- 二、分析
- 三、代碼
一、問題描述
給定一組個字符串,為每個字符串找出能夠唯一識別該字符串的最小前綴。
- 輸入描述:
- 輸出描述:
二、分析
- 這個是經典的字典樹的題目,Trie樹也稱字典樹,因為其效率很高,所以在在字符串查找、前綴匹配等中應用很廣泛,其高效率是以空間為代價的。
- 實現原理:
利用串構建一個字典樹,這個字典樹保存了串的公共前綴信息,因此可以降低查詢操作的復雜度。
- Trie樹詳解:Trie樹詳解
三、代碼
#include <iostream> #include <vector> #include <string> using namespace std;//Trie樹節點結構 struct Node {int cnt;//用來標記該字符所在節點的訪問次數Node* next[26]; //指向26個小寫的字母 a-z的節點指針// 對于最優前綴樹的每個節點都要將指針數組初始化為nullptr, // 每一個cnt都要初始化為1Node() :cnt(1){for (int i = 0; i < 26; i++){next[i] = nullptr;}} };int main() {Node*root = new Node();int n = 0;cin >> n;vector<string> strs(n);for (int i = 0; i < n; i++){string tmp;cin >> tmp; //對于每一個輸入的字符串,就構造前綴樹,加入七十中strs[i] = tmp;Node* p = root;for (int j = 0; j < tmp.size(); j++){if (p->next[tmp[j] - 'a'] != nullptr) // 節點的下一個 next[tmp[j] - 'a']不為空{p->next[tmp[j] - 'a']->cnt++; // 對這個節點的標記值 cnt++}else{p->next[tmp[j] - 'a'] = new Node(); //創建新的節點}p = p->next[tmp[j] - 'a']; // 將指針指向 下一個節點}}for (int i = 0; i < n; i++){Node* p = root;int j = 0;for (; j < strs[i].size(); j++){if (p->next[strs[i][j] - 'a']->cnt == 1){cout << strs[i].substr(0, j + 1) << endl; // 輸處從頭結點到 cnt=1位置的整個字符break;}p = p->next[strs[i][j] - 'a'];}if (j == strs[i].size()) // 代表整個字符串才是唯一可區分的{cout << strs[i] << endl;}}return 0; }總結
以上是生活随笔為你收集整理的美团--最小唯一前缀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美团--合并金币
- 下一篇: 力扣--扁平化嵌套列表迭代器