leetcode 336. 回文对
题目详情
题目链接
给定一组 互不相同 的单词, 找出所有不同 的索引对(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 {
public:
bool isPair(string &temp) const {
int left = 0, right = temp.size() - 1;
while (left < right) {
if (temp[left] != temp[right]) {
return false;
}
++left, --right;
}
return true;
}
vector<vector<int>> palindromePairs(vector<string>& words) {
vector<vector<int>> res;
for (int i = 0; i < words.size(); ++i) {
for (int j = 0; j < words.size(); ++j) {
if (i != j) {
string temp = words[i] + words[j];
if (isPair(temp)) {
res.push_back({i, j});
}
}
}
}
return res;
}
};
我的成绩
执行结果:超出时间限制
66 / 134 个通过测试用例
一些想法
我的方法时暴力求解。。。但超出了时间限制。
执行用时为 224 ms 的范例
class Solution {
public:
bool f(string& s,int left,int right){
while(left < right){
if(s[left++] != s[right--]) return false;//判断是否是回文对
}
return true;
}
vector<vector<int>> palindromePairs(vector<string>& words) {
//string test = "abcdef";
//cout << test.substr(3) << endl;
unordered_map<string,int> words_index_map;
set<int> word_size_set;
int n = words.size();
for(int i=0;i<n;i++){
words_index_map[words[i]]=i;//每个单词桶的value是索引
word_size_set.insert(words[i].size());//记录每个单词串长度
}
vector<vector<int>> res;
for(int i=0; i < words.size(); i++){
string word_reverse = words[i];
reverse(word_reverse.begin(), word_reverse.end());//反转每个单词
//如果reverse的字符在map中存在且不是自身,那么相加肯定是个回文对
if(words_index_map.count(word_reverse) && words_index_map[word_reverse] != i){
res.push_back({words_index_map[word_reverse], i});//返回两个单词对应索引
}
int length = word_reverse.size();
for(auto it = word_size_set.begin(); *it != length; it++){
int d = *it;
//遍历是否存在word前/后部分回文,以及剩余部分在map中是否存在,注意word已经是反转后的,map是没有反转的
//XXXXXabc,cba
//abcXXXXX,cba
if(f(word_reverse, 0, length - d - 1) &&
words_index_map.count(word_reverse.substr(length - d))){//substr表示索引从length-d开始到结束间的字符
res.push_back({i, words_index_map[word_reverse.substr(length - d)]});
}
if(f(word_reverse, d, length - 1) &&
words_index_map.count(word_reverse.substr(0, d))){
res.push_back({words_index_map[word_reverse.substr(0, d)], i});
}
}
}
return res;
}
};
思考
参见官方解答