​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:回文对 的相关文章

  • Python 中的方法参数[重复]

    这个问题在这里已经有答案了 假设我有这样的代码 class Num def init self num self n num def getn self return self n def getone return 1 myObj Num
  • openssh windows 错误的所有者或权限

    我已经安装了 windows 的 openssh 当我运行时ssh localhost I get C Users gary ssh config 上的所有者或权限错误 我看过这 2 个问题https superuser com quest
  • 我可以自动发送短信吗(无需用户批准)

    我对 Android 还很陌生 我正在尝试从 Android 应用程序发送短信 使用 SMS Intent 时 SMS 窗口将打开 用户需要批准 SMS 并发送 有没有办法无需用户确认就自动发送短信 谢谢 利奥尔 您可以使用此方法发送短信
  • 获取调用C#方法的实例

    我正在寻找一种算法 可以在该方法中获取调用该方法的对象 例如 public class Class1 public void Method the question object a the object that called the m
  • 如何在 CodeIgniter 中创建库类的多个实例?

    我想在 CodeIgniter 中创建一个类的多个实例 我已将我的类创建为一个库 但无法弄清楚用于创建多个实例的语法 来自 CodeIgniter 用户指南 CI 用户指南 加载器类 http codeigniter com user gu
  • 构造函数中具有实例名称知识的 Matlab 类

    我想要一个类 在其构造函数中可以了解其实例名称 提取为字符串 目前 我像这样提取名称 classdef mysession methods Access public function this mysession varargin thi
  • Android短信设置唯一ID

    我正在尝试开发一个发送和接收 SMS 消息 除其他外 的 Android 应用程序 我希望我的应用程序短信能够轻松识别 我不想使用 SMS 消息正文作为这个唯一标识符 我认为必须有一个我可以使用的 SMS 消息属性 遗憾的是 我未能找到一个
  • Twilio:此电话号码无法发送消息

    我现在有一个 Twilio 测试帐户 我获得了一个比利时电话号码 并验证了我自己的手机号码 我正在尝试从分配的 Twilio 号码向我的手机号码发送简单的 SMS 消息 但这不起作用 仪表板显示 此电话号码无法发送消息 但在消息常见问题解答
  • 是否可以在设备函数中调用cufft库调用?

    我在主机代码中使用 cuFFT 库调用 它们工作正常 但我想从内核调用 cuFFT 库 早期版本的 CUDA 没有这种支持 但是有了动态并行性 这可能吗 如果有任何关于如何实现这一目标的示例 那就太好了 尽管在 Kepler cc 3 5
  • SMS 的 .NET 代码

    HI all 我正在编写一些代码来通过 Zeep Mobile 发送 接收短信 http zeepmobile com developers http zeepmobile com developers 我查看了他们的谷歌群组 甚至联系了他
  • 发送自动短信

    首先 我们使用 net sql server 我有一位客户对能够在预定时间发送短信的系统感兴趣 除了通过电子邮件网关发送短信之外 我从未做过类似的事情 例如 电子邮件受保护 cdn cgi l email protection 但是 我认为
  • Nvidia Theano docker 镜像不可用

    尝试运行 docker 命令 nvidia docker run d p 8888 8888 e PASSWORD 123abcChangeThis theano secure start notebook sh Then open you
  • Web 应用程序可以使用个人电话发送短信吗

    我有一个客户每月发送大约 5000 条 SMS 消息 他们目前正在 iPhone 上执行此操作 方法是将消息实际输入到手机中 我认为这些信息相当重复 并且通常是针对群体的 他们不使用在线消息网关的原因纯粹是成本 我们可以在澳大利亚使用网关
  • CUDA程序导致nvidia驱动程序崩溃

    当我超过大约 500 次试验和 256 个完整块时 我的 monte carlo pi 计算 CUDA 程序导致我的 nvidia 驱动程序崩溃 这似乎发生在 monteCarlo 内核函数中 任何帮助都会受到赞赏 include
  • Visual Studio - 过滤掉 nvcc 警告

    我正在编写 CUDA 程序 但收到令人讨厌的警告 Warning Cannot tell what pointer points to assuming global memory space 这是来自 nvcc 我无法禁用它 有没有办法过
  • 如何使用短信内容提供商?文档在哪里?

    我希望能够读取系统的短信内容提供商 基本上我想制作一个短信应用程序 但只有当我可以看到过去的线程等时它才会有用 似乎有一个内容提供程序 但我找不到它的文档 有人知道它在哪里吗 Thanks 编辑 好的 我找到了一种获取短信收件箱提供程序的方
  • AT 命令 PHP

    我想使用 GSM 调制解调器从 php 发送消息 我已经配置了调制解调器并使用超级终端对其进行了测试 现在我想使用php执行AT命令 是否有可用的开源库或其他解决方案 由于我的 php 应用程序托管在 Apache Web 服务器上 因此我
  • 如何从 Android 设备检索 RCS 消息

    我如何在android中检索RCS消息 我可以使用 contentproviders 检索 SMS MMS 是否有适用于 Android 的 RCS 消息传递的 URI 我发现我的设备有这个 contentprovider 可用 所以我尝试
  • Javascript 中“是……的实例”是什么意思?

    这个问题的答案 JavaScript 函数的原型属性的初始值是多少 https stackoverflow com questions 4073677 what is the initial value of a javascript fu
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun

随机推荐

  • 取消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