1. 程式人生 > 實用技巧 >LeetCode 336. 迴文對 雜湊

LeetCode 336. 迴文對 雜湊

地址https://leetcode-cn.com/problems/palindrome-pairs/

給定一組 互不相同 的單詞, 找出所有不同的索引對(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"]

演算法1
兩個單詞能組成迴文 那麼有以下三種情況
1 兩個互為逆序 abc cba
2 較短的是較長的部分單詞的逆序 較長單詞除開互為逆序的部分
剩餘部分是迴文 比如 abcec ba 或者 lls s
注意可能有 “a” “”這種特殊詞彙 不過也可以歸到上述兩種情況

class Solution {
public:

unordered_map<string, int> mm;
vector<vector<int>> ans;
set<vector<int>> vis;

bool CheckIsPal(const string& s) { bool ret = false; if (s == "") return true; int l = 0; int r = s.size()-1; while (l < r) { if (s[l] != s[r]) return false; l++; r--; } ret = true; return ret; } void solve(const string& s,int idx, int isReverse) {
if (isReverse == 0) { for (int i = 0; i <= s.size(); i++) { string check = s.substr(0, i); string find = s.substr(i); reverse(find.begin(), find.end()); if (mm.count(find) && CheckIsPal(check) && idx != mm[find] ) { if (vis.count({ mm[find], idx }) == 0) { ans.push_back({ mm[find], idx }); vis.insert({ mm[find], idx }); } } } } else { for (int i = s.size(); i >= 0; i--) { string check = s.substr(i); string find = s.substr(0, i); reverse(find.begin(), find.end()); if (mm.count(find) && CheckIsPal(check) && idx != mm[find]) { if (vis.count({ idx,mm[find] }) == 0) { ans.push_back({ idx,mm[find] }); vis.insert({ idx, mm[find] }); } } } } } vector<vector<int>> palindromePairs(vector<string>& words) { for (int i = 0; i < words.size(); i++) { mm[words[i]] = i; } for (int i = 0; i < words.size(); i++) { string s = words[i]; solve(s, i,0); solve(s, i,1); } return ans; } };

堪堪AC 時間差點TLE