​LeetCode刷题实战336:回文对

2023-10-30

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 回文对,我们先来看题面:

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

Given a list of unique words, return all the pairs of the distinct indices (i, j) in the given list, so that the concatenation of the two words words[i] + words[j] is a palindrome.

给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。

示例

示例 1:

输入:words = ["abcd","dcba","lls","s","sssll"]
输出:[[0,1],[1,0],[3,2],[2,4]] 
解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]

示例 2:

输入:words = ["bat","tab","cat"]
输出:[[0,1],[1,0]] 
解释:可拼接成的回文串为 ["battab","tabbat"]

示例 3:

输入:words = ["a",""]
输出:[[0,1],[1,0]]

解题

https://cloud.tencent.com/developer/article/1787956

2.1 哈希map

class Solution {
public:
    vector<vector<int>> palindromePairs(vector<string>& words) {
      unordered_map<string, int> w_id;
      set<int> wdLen;
      for(int i = 0; i < words.size(); ++i)
      {
        w_id[words[i]] = i;//字符串idx
        wdLen.insert(words[i].size());//字符串长度
      }
      vector<vector<int>> ans;
      string front, back, revword;
      for(int i = 0; i < words.size(); ++i)
      {
        revword = words[i];//逆序的字符串
        reverse(revword.begin(),revword.end());
        if(w_id.count(revword) && w_id[revword] != i)
          ans.push_back({i, w_id[revword]});//字符串的逆序存在
        //遍历words[i]可能的子串长度,寻找前部分存在或者后部分存在
        //且自身剩余的子串为回文
        int len = words[i].size();
        for(auto it = wdLen.begin(); *it < len; ++it)
        {
          front = words[i].substr(0, *it);
          reverse(front.begin(),front.end());
          back = words[i].substr(*it);
          if(w_id.count(front) && ispalind(back))//前缀的逆存在
            ans.push_back({i, w_id[front]});
        }
        for(auto it = wdLen.begin(); *it < len; ++it)
        {
          front = revword.substr(0, *it);
          back = revword.substr(*it);
          if(w_id.count(front) && ispalind(back))//后缀的逆存在
            ans.push_back({w_id[front], i});
        }
      }
        return ans;
    }
    bool ispalind(string& s)
    {
      int l = 0, r = s.size()-1;
      while(l < r)
        if(s[l++] != s[r--])
          return false;
    return true;
    }
};

2.2 Trie树

class trie
{
public:
    unordered_map<char, trie*> next;
    int suffix = -1;
    void insert(string& s, int idx)
    {
        trie *cur = this;
        for(int i = s.size()-1; i >= 0; --i)//单词逆序插入
        {
            if(!cur->next[s[i]])
                cur->next[s[i]] = new trie();
            cur = cur->next[s[i]];
        }
        cur->suffix = idx;//结束时记录单词编号
    }
};
class Solution {
public:
    vector<vector<int>> palindromePairs(vector<string>& words) {
        trie * t = new trie(), *cur;
        vector<vector<int>> ans;
        string revword;
        for(int i = 0; i < words.size(); ++i)
        {
            t->insert(words[i], i);
        }
        for(int i = 0; i < words.size(); ++i)
        {
            int n = words[i].size(), j, k;
            cur = t;
            for(j = 0; j < n; ++j)
            {
                if(cur->suffix != -1 && cur->suffix != i
                    && ispalind(words[i], j, n-1))//单词的前缀的逆序在trie中,剩余的为回文
                    ans.push_back({i, cur->suffix});
                if(!cur->next[words[i][j]])
                    break;
                cur = cur->next[words[i][j]];
            }
            for(j = 0; j <= n; ++j)//等号上下只取一次,否则答案有重复的
            { // j == n 时包含了完整字符串的情况
                cur = t;
                for(k = n-j; k < n; ++k)//遍历单词的后缀
                {
                    if(!cur->next[words[i][k]])
                        break;
                    cur = cur->next[words[i][k]];
                }
                if(k==n && cur->suffix != -1
                    && cur->suffix != i 
                    && ispalind(words[i], 0, n-j-1))//该后缀的逆在trie中,且前部分为回文
                    ans.push_back({cur->suffix, i});
            }
        }
        return ans;
    }
    bool ispalind(string s, int l, int r)
    {
        while(l < r)
            if(s[l++] != s[r--])
                return false;
        return true;
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-320题汇总,希望对你有点帮助!

LeetCode刷题实战321:拼接最大数

LeetCode刷题实战322:零钱兑换

LeetCode刷题实战323:无向图中连通分量的数目

LeetCode刷题实战324:摆动排序 II

LeetCode刷题实战325:和等于 k 的最长子数组长度

LeetCode刷题实战326:3的幂

LeetCode刷题实战327:区间和的个数

LeetCode刷题实战328:奇偶链表

LeetCode刷题实战329:矩阵中的最长递增路径

LeetCode刷题实战330:按要求补齐数组

LeetCode刷题实战331:验证二叉树的前序序列化

LeetCode刷题实战332:重新安排行程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

​LeetCode刷题实战336:回文对 的相关文章

  • 如何从字符串形式的发送者向模拟器发送短信

    我经常在手机中收到短信 其中发送者中包含一些字符串而不是数字 例如公司名称 我想测试一些对这些短信做出反应的应用程序 但是如何将这样的短信发送到模拟器 如果我运行模拟器并执行以下操作 远程登录本地主机 5554 短信发送 MyBank 这是
  • Java 中有可用的 SMS Pdu 解析器吗?

    任何人都知道 Java 中可用的 Pdu 解析器来自 byte 数组 我主要关心的是获得符合 GSM 标准的用户数据头 UDH 我的意思是正确地得到它 smsLib http smslib org 已经比较成熟了 您还可以使用 Androi
  • 发送自动短信

    首先 我们使用 net sql server 我有一位客户对能够在预定时间发送短信的系统感兴趣 除了通过电子邮件网关发送短信之外 我从未做过类似的事情 例如 电子邮件受保护 cdn cgi l email protection 但是 我认为
  • 我无法从 Android 的 Kitkat 版本的收件箱中删除短信

    这是我的短信删除代码 if context getContentResolver delete Uri parse content sms inbox date and body new String ctime mess gt 0 Log
  • Android发送大量短信

    我有一个应用程序 它会向中央服务器发送大量短信 每个用户每天可能会发送约 300 个文本 SMS 消息被用作网络层 因为 SMS 几乎无处不在 而移动互联网却不然 该应用程序旨在供许多移动互联网尚未普及的第三世界国家使用 当我达到 100
  • 使 CUDA 内存不足

    我正在尝试训练网络 但我明白了 我将批量大小设置为 300 并收到此错误 但即使我将其减少到 100 我仍然收到此错误 更令人沮丧的是 在 1200 个图像上运行 10 epoch 大约需要 40 分钟 有什么建议吗 错了 我怎样才能加快这
  • 在 Mac OS X 10.7.4 上使用 OpenCL 禁用 Nvidia 看门狗

    我有一个 OpenCL 程序 对于小问题运行良好 但是当运行较大的问题超过 Nvidia 硬件上运行内核的 8 10 秒时间限制时 虽然我没有将显示器连接到我正在计算的 GPU Nvidia GTX580 上 但一旦内核运行大约 8 10
  • ios 如何验证输入的电话号码是否确实是用户的电话号码?

    我见过一些不同的应用程序 Snapchat whatsapp 等 要求用户输入电话号码 然后 系统会向用户发送一条带有代码的短信 以验证该号码是否确实是他们的号码 然后他们就可以看到哪些用户的地址簿联系人也拥有该应用程序 我了解所有这些是如
  • 如何从 Android 设备检索 RCS 消息

    我如何在android中检索RCS消息 我可以使用 contentproviders 检索 SMS MMS 是否有适用于 Android 的 RCS 消息传递的 URI 我发现我的设备有这个 contentprovider 可用 所以我尝试
  • Linux 上的 OpenCL 编译

    我是 OpenCL 的新手 从昨天开始 我尝试使用 OpenCL 进行并行编程 而不是使用我更熟悉且以前体验过的 CUDA 现在我有 NVIDIA GTX 580 GPU Ubuntu Linux 12 04 操作系统和 CUDA SDK
  • TensorFlow的./configure在哪里以及如何启用GPU支持?

    在我的 Ubuntu 上安装 TensorFlow 时 我想将 GPU 与 CUDA 结合使用 但我却停在了这一步官方教程 http www tensorflow org get started os setup md 这到底是哪里 con
  • 无法使用 abortBroadcast() 阻止短信?

    我正在开发一个短信拦截器应用程序 其中我使用广播接收器和 abortBroadcast 方法 正如许多人在这里建议的那样 防止消息到达收件箱并提醒用户 但就我而言 当我使用模拟器发送短信时 短信不会被阻止 并到达收件箱 我也会收到错误 06
  • 使用 SSH.NET SftpClient 设置扩展文件属性

    在使用 Renci SSH NET SFTP 库将文件从 Windows 上传到远程计算机 Ubuntu 16 04 LTS 后 我尝试使用扩展文件属性来存储一些信息 但属性没有得到保留 这就是我尝试设置扩展属性的方式 SftpFileAt
  • SSH:连接被远程服务器关闭

    我正在尝试 ssh 登录我的远程服务器 但每当我尝试使用 ssh 命令通过终端登录时 ssh root ip address 我收到错误 Connection closed by ip address 我检查了主机拒绝和主机允许 文件中没有
  • 模拟器可以给自己发送短信吗

    我一直在尝试通过广播在 Android 4 0 模拟器上发送消息 并通过广播接收器获取该消息 我可以使用两个模拟器 例如从 5554 到 5556 来执行此操作 但是 我无法获取从 5554 发送到自身的消息 我发送消息的方式如下 SmsM
  • 非默认短信应用程序在收到短信时是否可以始终接收广播,即使强制关闭也是如此?

    所以我遵循了这个收到短信时显示简单的祝酒词 虽然应用程序运行时它工作正常 但当我进入设置并强制关闭应用程序时 它会停止工作 我在 StackOverflow 上检查了许多类似问题的答案 但没有一个真正回答是否 以及如何 可以在每次收到短信时
  • 如何加速数百万个对象的Python实例初始化?

    我定义了一个pythonclass named Edge如下 class Edge def init self self node1 0 self node2 0 self weight 0 现在我必须使用以下命令创建大约 10 6 到 1
  • AngularJS 中的非单例服务

    AngularJS 在其文档中明确指出服务是单例 AngularJS services are singletons 违反直觉的是 module factory还返回一个 Singleton 实例 鉴于非单例服务有很多用例 实现工厂方法以返
  • CUDA 代码会损坏 GPU 吗?

    在测试包含内存错误的 CUDA 时 我的屏幕被冻结了 重新启动后我无法再检测到显卡 我的代码是否有可能物理损坏该卡 这发生在 Ubuntu 14 04 下 我不知道该卡的型号 因为我无法检测到它 但我记得它是一张相当新的卡 感谢所有的评论我
  • 管道中缺少 ResourceT 实例

    我在尝试使用时遇到奇怪的错误ResourceT http hackage haskell org package conduit 1 0 9 1 docs Data Conduit html t 3aResourceT来自管道 1 0 9

随机推荐

  • 取消idea双击shift时出现的搜索框

    快捷键 Ctrl Shift A 有可能没反应 Help gt Find Action 输入registry 选择第一个 找到ide suppress double click handler 勾选它 双击shift不会再弹出搜索框
  • reportlab 使用中文报错 reportlab.pdfbase.ttfonts.TTFError: Not a recognized TrueType font

    使用reportlab 使用中文报错过程中 注册了 simsun 字体 然后就报这个错误 reportlab pdfbase ttfonts TTFError Not a recognized TrueType font version 0
  • thread_create 和 thread_resume

    在lk中我们一般通过thread create 来新建一个thread 但这个thread 是THREAD SUSPENDED 必须要调用thread resume 才能开始运行 enum thread state THREAD SUSPE
  • 城市内涝及桥洞隧道积水在线监测系统

    一 方案概述 近几年 全国频频爆发暴雨等极端天气 这对社会管理 城市运行和人民群众生产生活造成了巨大影响 加之部分城市排水防涝等基础设施建设滞后 调蓄雨洪和应急管理能力不足 出现了严重的暴雨内涝灾害 城市中的隧道和立交桥等低洼路段在遭遇短时
  • YOLOv3使用笔记——Kmeans聚类计算anchor boxes

    anchor boxes用来预测bounding box faster rcnn中用128 128 256 256 512 512 分三个尺度变换1 1 1 2 2 1 共计9个anchor来预测框 每个anchor预测2000个框左右 使
  • qedl中的fixDepth()简化

    如果将PerspectiveMode的设置为1 则会传递zNear和Zfar 在fixDepth 中 而将perspectiveMode 0 则大大简化fixDepth float fixDepth float depth return c
  • 贷款预测问题(探索性分析+多种解决方案)

    用到的数据集 train 链接 https pan baidu com s 1hCQKvLYxTb5MkltJDa1QlQ 提取码 jsh8 test 链接 https pan baidu com s 16SkJ7fo1yEutv4CwnW
  • 工厂方法(Factory Method):对象创建型模式

    文章目录 1 代码示例 2 工厂方法模式的定义 实现意图 1 代码示例 工厂方法模式 简称工厂模式或者多态工厂模式 与简单工厂模式相比 引入了更多的新类 灵活性更强 实现也更加复杂 符合开闭原则 付出的代价是需要新增加多个新的工厂类 如下
  • linux 卸载iscsi,iscsi挂载和删除

    iscsi挂载和删除 2011 01 01 11 54 01 分类 存储 字号 iscsi操作 http blog csdn net do2jiang archive 2009 12 29 5097730 aspx trune2fs c l
  • Python学习之:如何根据经纬度来实现地图的可视化(将这些点在地图上标注出来)

    文章目录 最终效果展示 实操步骤 第一步 打开高德地图的控制台 gt 数据可视化 第二步 创建可视化项目 第三步 上传CSV数据 注意格式要求 一定要包含经纬度信息 第四步 创建可视化实例 最终效果展示 这些红色的点 就是我们给出的经纬度的
  • javascript实现回到顶部按钮特效

    有时由于页面内容过多 每次回到顶部比较麻烦 所以记录一下JavaScript实现回到顶部按钮特效的代码 便于以后备用 css代码 实现回到顶部按钮特效 box position fixed right 10px bottom 10px he
  • Hadoop伪分布模式配置

    Hadoop共有三种部署方式 本地模式 伪分布模式及集群模式 本次安装配置以伪分布模式为主 即在一台服务器上运行Hadoop 如果是分布式模式 则首先要配置Master主节点 其次配置Slave从节点 以下说明如无特殊说明 默认使用root
  • QT多窗口

    常用的窗体基类是 QWidget QDialog 和 QMainWindow 在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择 QWidget 直接继承于 QObject 是 QDialog 和 QMainWindow 的父类
  • 在学习Python时遇到的一些项目bug

    启动线程 开启任务时 1 出现错误TypeError init got an unexpected keyword argument arg ok python没有能解析出来这个参数 好吧少写了个s 加上就没啥问题了 2 出现错误TypeE
  • 丑数打表 & 计算 (自用)

    丑数定义 只包含因子2 3 5的正整数被称作丑数 define min a b a lt b a b define min4 a b c d min min a b min c d int choushu 5850 int main int
  • 代理模型:最小二乘支持向量回归(LSSVR)--- MATLAB程序

    写在开头 代理模型是工程问题中常用的一个优化方法 当实际问题计算量很大 不容易求解时 可以使用计算量较小 求解迅速的简化模型来替代原模型 加速优化过程 代理模型采用一个数据驱动的 自下而上的办法来建立 首先 通过抽样得到有限个样本点 输入
  • java烟花代码_一个美丽的java烟花程序

    import java awt import java applet import java awt event import javax swing public class ChatApplet extends Applet imple
  • Shell 从入门到精通(二)

    变量的赋值方式 定义或引用变量时注意事项 双引号是弱引用 单引号是强引用 即单引号是所见即所得 双引号是进行了赋值操作 两个反引号等价于 反引号的中的shell命令会被先执行 变量数值运算 1 整数运算 expr 五颗星 2 整数运算 四颗
  • Spring源码解析4.createBean()方法解析

    createBeanInstance protected BeanWrapper createBeanInstance String beanName RootBeanDefinition mbd Nullable Object args
  • ​LeetCode刷题实战336:回文对

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 回文对 我们先来看题面 htt