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