Given a list of unique words. Find all pairs of distinct indices (i, j)
in the given list, so that the concatenation of the two words, i.e.words[i] + words[j]
is a palindrome.
Example 1:
Given words
= ["bat", "tab", "cat"]
Return [[0, 1], [1, 0]]
The palindromes are ["battab", "tabbat"]
Example 2:
Given words
= ["abcd", "dcba", "lls", "s", "sssll"]
Return [[0, 1], [1, 0], [3, 2], [2, 4]]
The palindromes are ["dcbaabcd", "abcddcba", "slls", "llssssll"]
思路1:对每个word的字串进行遍历,考察其是否可以作为前缀或后缀,时间成本O(n*k)(n为字符串组大小,k为字符串平均长度)
但是TLE。。。
class Solution {
public:
bool isRev(string s,int start,int end){
while(start<end){
if(s[start]==s[end]){
start++;
end--;
return false;
}
}
return true;
}
vector<vector<int>> palindromePairs(vector<string>& words) {
vector<vector<int>> res;
unordered_map<string,int> dict;
for(int i=0;i<words.size();i++){
dict[words[i]]=i; //store words in map
}
for(int i=0;i<words.size();i++){
string str=words[i];
for(int j=0;j<=str.size();i++){
/**if str can be the suffix of palindrome**/
if(isRev(str,j,str.size()-1)){
string suffix=str.substr(0,j);
reverse(suffix.begin(),suffix.end());
if(dict.find(suffix)!=dict.end()&&dict[suffix]!=i){
vector<int> temp;
temp.push_back(i);
temp.push_back(dict[suffix]);
res.push_back(temp);
}
}
/**if str can be the prefix of palindrome**/
if(j>0&&isRev(str,0,j-1)){
string prefix=str.substr(j);
reverse(prefix.begin(),prefix.end());
if(dict.find(prefix)!=dict.end()&&dict[prefix]!=i){
vector<int> temp;
temp.push_back(dict[prefix]);
temp.push_back(i);
res.push_back(temp);
}
}
}
}
return res;
}
};
思路2: