当前位置: 首页 > news >正文

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

题目:

题解:

#define SIZE 9470
#define N 168000
#define P 13331typedef unsigned long long ULL;
ULL p[301];//p[i]存储P^ivoid 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.lryc.cn/news/428309.html

相关文章:

  • 【SQL】仅出现一次的最大数据
  • MySQL 数据类型详解及SQL语言分类-DDL篇
  • Leet Code 128-最长连续序列【Java】【哈希法】
  • 网络协议(概念版)
  • Pulsar官方文档学习笔记——消息机制
  • PyTorch--残差网络(ResNet)在CIFAR-10数据集进行图像分类
  • ETAS工具链自动化实战指南<一>
  • 疫情期间我面试了13家企业软件测试岗位,一些面试题整理
  • PINCE——Linux 原生游戏内存修改器,一款替代 Cheat Engine 的强大游戏修改器,Linux 游戏玩家必备神器!
  • 为IntelliJ IDEA安装插件
  • ES6 Promise
  • html+css 实现hover 凹陷按钮
  • 什么是负载均衡?负载均衡器如何运作?
  • (Arxiv-2023)潜在一致性模型:通过少步推理合成高分辨率图像
  • Unity与UE,哪种游戏引擎适合你?
  • 这五本大模型书籍,把大模型讲的非常详细,收藏我这一篇就够了
  • 伊朗通过 ChatGPT 试图影响美国大选, OpenAI 封禁多个账户|TodayAI
  • windows系统如何走后面之windows系统隐藏账户
  • Elasticsearch(ES)(版本7.x)数据更新后刷新策略RefreshPolicy
  • 【运维】从一个git库迁移到另一个库
  • and design vue表格列宽度拖拽,vue-draggable-resizable插件使用
  • 使用hexo搭建个人博客
  • java geotool构建地理点线面
  • C# 中 Grpc服务端调用客户端方法
  • Arthas相关命令
  • 2024年江苏省职业院校技能大赛 移动应用与开发中职赛项规程
  • 2024 Google 开发者大会,沉浸式体验AI社会公益
  • OpenCV(开源计算机视觉库)
  • Java二十三种设计模式-责任链模式(17/23)
  • Electron31-ViteAdmin桌面端后台|vite5.x+electron31+element-plus管理系统Exe