日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 336. 回文对(哈希map/Trie树)

發布時間:2024/7/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 336. 回文对(哈希map/Trie树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 哈希map
      • 2.2 Trie樹

1. 題目

給定一組唯一的單詞, 找出所有不同 的索引對(i, j),使得列表中的兩個單詞, words[i] + words[j] ,可拼接成回文串。

示例 1: 輸入: ["abcd","dcba","lls","s","sssll"] 輸出: [[0,1],[1,0],[3,2],[2,4]] 解釋: 可拼接成的回文串為 ["dcbaabcd","abcddcba","slls","llssssll"]示例 2: 輸入: ["bat","tab","cat"] 輸出: [[0,1],[1,0]] 解釋: 可拼接成的回文串為 ["battab","tabbat"]

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/palindrome-pairs
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 哈希map

class Solution { public:vector<vector<int>> palindromePairs(vector<string>& words) {unordered_map<string, int> w_id;set<int> wdLen;for(int i = 0; i < words.size(); ++i){w_id[words[i]] = i;//字符串idxwdLen.insert(words[i].size());//字符串長度}vector<vector<int>> ans;string front, back, revword;for(int i = 0; i < words.size(); ++i){revword = words[i];//逆序的字符串reverse(revword.begin(),revword.end());if(w_id.count(revword) && w_id[revword] != i)ans.push_back({i, w_id[revword]});//字符串的逆序存在//遍歷words[i]可能的子串長度,尋找前部分存在或者后部分存在//且自身剩余的子串為回文int len = words[i].size();for(auto it = wdLen.begin(); *it < len; ++it){front = words[i].substr(0, *it);reverse(front.begin(),front.end());back = words[i].substr(*it);if(w_id.count(front) && ispalind(back))//前綴的逆存在ans.push_back({i, w_id[front]});}for(auto it = wdLen.begin(); *it < len; ++it){front = revword.substr(0, *it);back = revword.substr(*it);if(w_id.count(front) && ispalind(back))//后綴的逆存在ans.push_back({w_id[front], i});}}return ans;}bool ispalind(string& s){int l = 0, r = s.size()-1;while(l < r)if(s[l++] != s[r--])return false;return true;} };

904 ms 45.6 MB

2.2 Trie樹

class trie { public:unordered_map<char, trie*> next;int suffix = -1;void insert(string& s, int idx){trie *cur = this;for(int i = s.size()-1; i >= 0; --i)//單詞逆序插入{if(!cur->next[s[i]])cur->next[s[i]] = new trie();cur = cur->next[s[i]];}cur->suffix = idx;//結束時記錄單詞編號} }; class Solution { public:vector<vector<int>> palindromePairs(vector<string>& words) {trie * t = new trie(), *cur;vector<vector<int>> ans;string revword;for(int i = 0; i < words.size(); ++i){t->insert(words[i], i);}for(int i = 0; i < words.size(); ++i){int n = words[i].size(), j, k;cur = t;for(j = 0; j < n; ++j){if(cur->suffix != -1 && cur->suffix != i&& ispalind(words[i], j, n-1))//單詞的前綴的逆序在trie中,剩余的為回文ans.push_back({i, cur->suffix});if(!cur->next[words[i][j]])break;cur = cur->next[words[i][j]];}for(j = 0; j <= n; ++j)//等號上下只取一次,否則答案有重復的{ // j == n 時包含了完整字符串的情況cur = t;for(k = n-j; k < n; ++k)//遍歷單詞的后綴{if(!cur->next[words[i][k]])break;cur = cur->next[words[i][k]];}if(k==n && cur->suffix != -1&& cur->suffix != i && ispalind(words[i], 0, n-j-1))//該后綴的逆在trie中,且前部分為回文ans.push_back({cur->suffix, i});}}return ans;}bool ispalind(string s, int l, int r){while(l < r)if(s[l++] != s[r--])return false;return true;} };

940 ms 141.3 MB

trie 改用數組 trie* next[26] = {NULL}; 提高運行效率

280 ms 208.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 336. 回文对(哈希map/Trie树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。