LeetCode 336. 回文对 哈希

地址 https://leetcode-cn.com/problems/palindrome-pairs/

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

算法1
两个单词能组成回文 那么有以下三种情况
1 两个互为逆序 abc cba
2 较短的是较长的部分单词的逆序 较长单词除开互为逆序的部分
剩余部分是回文 比如 abcec ba 或者 lls s
注意可能有 “a” “”这种特殊词汇 不过也可以归到上述两种情况

复制代码
class Solution {
public:

unordered_map<string, int> mm;
vector<vector<int>> ans;
set<vector<int>> vis;

bool CheckIsPal(const string& s)
{
    bool ret = false;
    if (s == "") return true;
    int l = 0; int r = s.size()-1;

    while (l < r) {
        if (s[l] != s[r]) return false;
        l++; r--;
    }

    ret = true;
    return ret;
}

void solve(const string& s,int idx, int isReverse)
{
    if (isReverse == 0) {
        for (int i = 0; i <= s.size(); i++) {
            string check = s.substr(0, i);
            string find = s.substr(i);
            reverse(find.begin(), find.end());
            if (mm.count(find) && CheckIsPal(check) && idx != mm[find] ) {
                if (vis.count({ mm[find], idx }) == 0) {
                    ans.push_back({ mm[find], idx });
                    vis.insert({ mm[find], idx });
                }

            }
        }
    }
    else {
        for (int i = s.size(); i >= 0; i--) {
            string check = s.substr(i);
            string find = s.substr(0, i);
            reverse(find.begin(), find.end());
            if (mm.count(find) && CheckIsPal(check) && idx != mm[find]) {
                if (vis.count({ idx,mm[find] }) == 0) {
                    ans.push_back({ idx,mm[find] });
                    vis.insert({ idx, mm[find] });
                }
            }
        }
    }

}

vector<vector<int>> palindromePairs(vector<string>& words) {


    for (int i = 0; i < words.size(); i++) {
        mm[words[i]] = i;
    }

    for (int i = 0; i < words.size(); i++) {
        string s = words[i];
        solve(s, i,0);
        solve(s, i,1);
    }

    return ans;
}

};
复制代码

堪堪AC 时间差点TLE

posted on   itdef  阅读(166)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2018-08-06 cpp 区块链模拟示例(三)新基本原形工程的建立
2018-08-06 cpp 区块链模拟示例(二)工程代码解析
2018-08-06 cpp 区块链模拟示例(一)工程建立
2016-08-06 模板学习实践三 functor
2016-08-06 模板学习实践二 pointer

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示