这题最开始使用暴力破解的方法。时间复杂度(O(k*n^2))k是string中最长的长度。判断是否是回文的程序如下:
bool is_palindrome(string word1,string word2)
{
int word1len = int(word1.size()),word2len = int(word2.size());
if (word1len>word2len) {
for (int i = 0,j = word2len-1; j>=0;) {
if (word1[i++]!=word2[j--]) {
returnfalse;
}
}
for (int i = word2len,j = word1len-1; i<j;) {
if (word1[i++]!=word1[j--]) {
returnfalse;
}
}
returntrue;
}else{
for (int i = 0,j = word2len-1; i<word1len;) {
if (word1[i++]!=word2[j--]) {
returnfalse;
}
}
for (int i = 0,j = word2len-word1len-1; i<j;) {
if (word2[i++]!=word2[j--]) {
returnfalse;
}
}
returntrue;
}
}
主函数如下
vector<vector<int>> palindromePairs(vector<string>& words) {
vector<vector<int>>result;
for (int i = 0; i<words.size(); i++) {
for (int j = 0; j<words.size(); j++) {
if(i==j)
continue;
if(is_palindrome(words[i],words[j]))
result.push_back(vector<int>{i,j});
}
}
return result;
}
然而
TLE。
思考了一下发现,对于每个word,相对于和(n-1)个剩余的word做判断(O(kn)),更好的方式是构造前后2*word.size()个不同的潜在word,然后做判断。
例如”wang”
前项包含””,”g”,”gn”,”gna”,”gnaw”,
后项包含””,”w”,”aw”,”naw”,”gnaw"
额外需要注意的是不要包含自身,题设中给的例子2,结果中就不包含[3,3]
Given
words
=
["abcd", "dcba", "lls", "s", "sssll"]
Return
[[0, 1], [1, 0], [3, 2], [2, 4]]
代码如下:
vector<vector<int>> palindromePairs2(vector<string>& words) {
vector<vector<int>>result;
unordered_map<string, int>word_map;
for (int i = 0; i<words.size(); i++) {
word_map[words[i]] = i;
}
for (int i = 0; i<words.size(); i++) {
for (int m = 0; m<words[i].size(); m++) {
string temp1(words[i].rend()-m,words[i].rend());
string temp2(words[i].rbegin(),words[i].rbegin()+m);
if(is_palindrome(words[i],temp1)&&word_map.find(temp1)!=word_map.end()&&temp1!=words[i])
result.push_back(vector<int>{i,word_map[temp1]});
if(is_palindrome(temp2,words[i])&&word_map.find(temp2)!=word_map.end()&&temp2!=words[i])
result.push_back(vector<int>{word_map[temp2],i});
}
string temp3(words[i].rbegin(),words[i].rend());
if(temp3!=words[i]&&is_palindrome(words[i],temp3)&&word_map.find(temp3)!=word_map.end())
result.push_back(vector<int>{i,word_map[temp3]});
}
return result;
}
GitHub:
不过时间还是很慢的134个例子跑了1468ms,肯定还能进一步优化,我觉得是我的判断是否回文太ugly了~~。