【leetcode】Palindrome Pairs

这题最开始使用暴力破解的方法。时间复杂度(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了~~。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值