C语言 | Leetcode C语言题解之第336题回文对

news2025/1/12 13:32:11

题目:

题解:

#define SIZE 9470
#define N 168000
#define P 13331

typedef unsigned long long ULL;
ULL p[301];//p[i]存储P^i

void init()//初始化p进制次幂数组
{
    int i;
    p[0]=1;
    for(i=1;i<300;i++)
    {
        p[i]=p[i-1]*P;
    }
}


int** palindromePairs(char**words, int wordsSize, int* returnSize, int** returnColumnSizes){
    int **re=(int **)malloc(sizeof(int *)*N);
    *returnColumnSizes=(int *)malloc(sizeof(int)*N);
    int i,j,k;
    int index=0;
    int len;
    int l,r;
    int hash[SIZE];//存储某字符串hash值在words中的对应下标
    ULL key[SIZE];//存储字符串hash值,可近似认为字符串与hash值之间是一一对应的
    ULL t;
    ULL pre[301];//存储前缀字符串hash值,pre下标从1开始(即pre[i]存储某字符串前i个子字符串的哈希值),注意下标转换
    char *word=NULL;
    init();//初始化p数组
    memset(hash,-1,sizeof(hash));
    for(i=0;i<wordsSize;i++)
    {
        t=0;
        word=words[i];
        for(j=strlen(word)-1;j>=0;j--)//倒序遍历计算哈希值t
        {
            t=t*P+word[j];
        }
        //第二层哈希,将hash值及对应下标存入哈希表
        j=t%SIZE;
        while(hash[j]!=-1)
        {
            j=(j+1)%SIZE;
        }
        hash[j]=i;
        key[j]=t;
    }
    for(i=0;i<wordsSize;i++)
    {
        word=words[i];
        len=strlen(word);
        pre[0]=0;
        for(j=0;j<len;j++)//计算前缀哈希值数组
        {
            pre[j+1]=pre[j]*P+word[j];
        }
        for(j=-1;j<len;j++)//正向查找回文串
        {
            for(l=0,r=j;l<r;l++,r--)
            {
                if(word[l]!=word[r])
                {
                    break;
                }
            }
            if(l>=r)//下标0-j是一个回文串,查找原字符串数组中是否存在j+1-末尾的翻转字符串
            {
                t=pre[len]-pre[j+1]*p[len-j-1];//j+1-末尾子字符串的哈希值
                k=t%SIZE;
                while(hash[k]!=-1&&key[k]!=t)
                {
                    k=(k+1)%SIZE;
                }
                if(hash[k]>=0&&hash[k]!=i)//找到了且不是自身
                {
                    re[index]=(int *)malloc(sizeof(int)*2);
                    re[index][0]=hash[k];
                    re[index][1]=i;
                    returnColumnSizes[0][index++]=2;
                    if(words[hash[k]][0]==0)//空字符串,特处
                    {
                        re[index]=(int *)malloc(sizeof(int)*2);
                        re[index][0]=i;
                        re[index][1]=hash[k];
                        returnColumnSizes[0][index++]=2;
                    }
                }
            }
        }
        for(j=len-1;j>0;j--)//反向查找回文串
        {
            for(l=j,r=len-1;l<r;l++,r--)
            {
                if(word[l]!=word[r])
                {
                    break;
                }
            }
            if(l>=r)//下标j-末尾子字符串是回文串
            {
                t=pre[j];//前j-1个子字符串的hash值
                k=t%SIZE;
                while(hash[k]!=-1&&key[k]!=t)
                {
                    k=(k+1)%SIZE;
                }
                if(hash[k]>=0&&hash[k]!=i)//找到了且不是自身
                {
                    re[index]=(int *)malloc(sizeof(int)*2);
                    re[index][0]=i;
                    re[index][1]=hash[k];
                    returnColumnSizes[0][index++]=2;
                }
            }
        }
    }
    *returnSize=index;
    return re;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node异常:npm ERR! gyp verb check python checking Python executable “python2“ in t

node异常:npm ERR! gyp verb check python checking Python executable "python2" in t node异常&#xff1a; npm ERR! gyp verb check python checking for Python executable "python2" in t降低版本&#xff1a;npm install -g npm6.14.4 欢迎关注&a…

设计模式六大原则(一)--单一职责原则

GPT-4o (OpenAI) 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;是面向对象设计中的一条基本原则。该原则的核心思想是&#xff1a;一个类应该只有一个引起它变化的原因。换句话说&#xff0c;一个类应该只有一个职责&#xff08;即一个…

【嵌入式操作系统(Linux篇)】知识点期末复习(2)

以下是关于嵌入式操作系统&#xff08;Linux篇&#xff09;的知识点总结版 目录 ​ part 1 Linux系统基础 1、嵌入式OS(EOS): 2、嵌入式操作系统的特点 3、嵌入式Linnx的优势 4、Linnx是什么&#xff1f;是一种UNIX操作系统的克隆 5、Linux操作系统整体介绍. (1)Lin…

智能外呼机器人助力电销

在接回一家公司的电话时&#xff0c;听着员工那动听的声音&#xff0c;你或许会猜到电话那头是个清纯美丽的女孩&#xff0c;其实&#xff0c;打电话给你的只是一个机器人。外呼智能机器人开启了智能人机交互时代。 1、情绪稳定 每个电话都可以用最佳的声音和答案与客户进行沟…

SpringBoot响应式编程(2)WebFlux入门

一、概述 1.1简介 简单来说&#xff0c;Webflux 是响应式编程的框架&#xff0c;与其对等的概念是 SpringMVC。两者的不同之处在于 Webflux 框架是异步非阻塞的&#xff0c;其可以通过较少的线程处理高并发请求。 WebFlux&#xff1a;底层完全基于nettyreactorspringweb 完成…

深入解析 vue 3 获取响应式数据

Vue 3 引入了一个全新的响应式系统&#xff0c;其中最核心的就是 reactive 和 ref。它们是实现响应式数据的基础&#xff0c;用于创建可以自动跟踪变化并更新视图的对象和变量。 1. reactive&#xff1a;响应式对象 1、概念 reactive 是用于创建响应式对象的 API。它接收一个…

HighConcurrencyCommFramework c++通讯服务器框架 :Epoll:事件驱动技术

在单独的进程或者线程中运行&#xff0c;收集处理事件&#xff0c;没有上下文切换的消耗&#xff0c;高校&#xff1b; 写小demo很简单&#xff0c;正经让epoll技术融合到商业环境中&#xff0c;那么难度很大&#xff1b; 达到的效果&#xff1a; 1.理解工作原理&#xff1b…

Splay学习笔记

Splay的两个关键函数&#xff0c;rotate和splay rotate就是正常的旋转。 splay(x,target)表示把x旋转为target的子节点 这里需要分讨&#xff0c;对于x的父亲y和祖父z 若 z target&#xff0c; 则直接转x若 x 与 y 方向相同&#xff0c;先转y&#xff0c;后转x若 x 与 y 方…

html+css网页制作 电商华为商城首页 ui还原度100%

htmlcss网页制作 电商华为商城首页 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码…

Docker日志管理

一、知识点介绍 1.ELK(Elasticserach、Logstash、Kibana) 前面笔记有 2.什么是 Filebeat Filebeat 是 ELK 组件的新成员&#xff0c; 也是 Beat 成员之一。基于 Go 语言开发&#xff0c;无任何依赖并且比 Logstash 更加轻量&#xff0c;不会带来过高的资源占用&#xff0c; …

django常用的组合搜索组件

文章目录 django常用的组合搜索组件快速使用配置信息1. 视图函数2. 前端模板3. css样式 代码实现 django常用的组合搜索组件 在项目开发中&#xff0c;如果有大量数据就要用到组合搜索&#xff0c;通过组合搜索对大块内容进行分类筛选。 快速使用 三步走&#xff1a;&#xf…

刷题记录第110天-分割等和数组

解题思路&#xff1a; 问题可转化为&#xff0c;用给定数组能否装满一个容量为数组总和一半的背包(targetsum/2)&#xff0c;即一个0-1背包问题。 0-1背包问题的关键在于数组的定义和状态转移方程以及价值的定义。dp[i][j]表示在[0…i]个物品内&#xff0c;背包容量为j能装的最…

再升级!MoneyPrinterPlus集成GPT_SoVITS

最近有很多优秀的语音合成TTS工具&#xff0c;目前MoneyPrinterPlus已经集成了ChatTTS和fasterWhisper。应朋友们的要求&#xff0c;最近MoneyPrinterPlus也集成了GPT_SoVITS这个优秀的语音合成工具。 今天给大家详细讲解一下&#xff0c;如何在MoneyPrinterPlus中使用GPT_SoV…

机器学习速成第三集——无监督学习之降维(理论部分)!

目录 主成分分析&#xff08;PCA&#xff09; 独立成分分析&#xff08;ICA&#xff09; t分布随机邻近嵌入&#xff08;t-SNE&#xff09; 线性判别分析&#xff08;LDA&#xff09; 其他降维方法 应用场景 主成分分析&#xff08;PCA&#xff09;在处理大规模数据集时…

新能源汽车电机低频电磁场仿真应用

一、背景介绍 随着新能源汽车的普及&#xff0c;电机作为新能源汽车驱动系统的核心组成部分&#xff0c;其重要性不言而喻。电机使电能转化为机械能&#xff0c;通过传动系统将机械能传递到车轮&#xff0c;驱动汽车行驶。新能源汽车电机的发展经历了从初步探索到技术成熟的多…

Localization Translate API 的对接和使用

Localization Translate API 的对接和使用 Localization Translate API 的主要功能是通过输入需要翻译的文本来获取翻译后的文本&#xff0c;同时翻译后的语言可以自定义&#xff0c;并且翻译结果可以采用 json &#xff0c; markdown 俩种主流的方法来输出。 本文档将详细介…

【安卓】多线程编程

文章目录 线程的简单应用解析异步消息处理机制使用AsyncTask 线程的简单应用 新建一个AndroidThreadTest项目&#xff0c;然后修改activity_main.xml中的代码。 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width…

CNN-GRU神经网络多输入单输出回归预测【MATLAB】

1. CNN&#xff08;卷积神经网络&#xff09;部分 作用&#xff1a; 特征提取&#xff1a;CNN擅长从输入数据中提取空间特征。在多输入情况下&#xff0c;它可以处理来自不同源的数据&#xff0c;提取有用的特征。 局部感受野&#xff1a;通过卷积操作&#xff0c;CNN能够识别…

【ACM出版,往届会后三个半月EI见刊/检索】第四届物联网与机器学习国际学术会议(IoTML 2024,8月23-25)

2024年第四届物联网与机器学习国际学术会议&#xff08;IoTML 2024&#xff09;将于2024年8月23-25日在中国南昌召开。 会议将围绕着物联网和机器学习开展&#xff0c;探讨本领域发展所面临的关键性挑战问题和研究方向&#xff0c;以期推动该领域理论、技术在高校和企业的发展和…

vector嵌套之空指针异常

文章目录 1. 题目链接2. 题目代码正确代码错误代码 1. 题目链接 118. 杨辉三角 2. 题目代码 正确代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> result(numRows);for(int i 0; i < numRows; i)…