336. 回文对(C++)---哈希表解题

题目详情

给定一组唯一的单词, 找出所有不同 的索引对(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"]


——题目难度:困难


 





-解题代码

class Solution {
private:
	vector wordsRev;
	unordered_map mp;
	
public:
	int findWord(const string& s, int left, int right) {
		auto it = mp.find(s.substr(left, right - left + 1)); //用find函数找key,得到的是一个iterator 
		return it == mp.end() ? -1 : it->second;
	}
	
	bool isPalindrome(const string& s, int left, int right) {
		while (left < right && s[left] == s[right]) {
			left++;
			right--;
		}
		if (left >= right) return true;
		
		return false;
	}
	
    vector> palindromePairs(vector& words) {
		int n = words.size();
		for(const string& word : words) {
			wordsRev.push_back(word);
			reverse(wordsRev.back().begin(), wordsRev.back().end());
		}
		for(int i = 0; i < n; i++) {
			mp[wordsRev[i]] = i;
			//mp.insert({wordsRev[i], i});
		}
		
		vector> ans;
		for(int i = 0; i < n; i++) {
			int m = words[i].size();
			if (!m) {
				continue;
			}

			string word(words[i]);
			for(int j = 0; j <= m; j++) {
				if (isPalindrome(word, j, m - 1)) {
					int left_id = findWord(word, 0, j - 1);
					if (left_id != -1 && left_id != i) {
						ans.push_back({i, left_id});
					}
				}
				if (j && isPalindrome(word, 0, j - 1)) {
					int right_id = findWord(word, j, m - 1);
					if (right_id != -1 && right_id != i) {
						ans.push_back({right_id, i});
					}
				}
			}
		}
		
		return ans;	
    }
};

结果
336. 回文对(C++)---哈希表解题_第1张图片

你可能感兴趣的:(LeetCode-解题记录,leetcode,哈希表,字符串,C++)