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

字符串--- 最长公共前缀 | 最长回文子串 | 二进制求和

一.14. 最长公共前缀题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀返回空字符串。示例 1输入strs [flower,flow,flight]输出fl示例 2输入strs [dog,racecar,car]输出解释输入不存在公共前缀。解题思路将第一个字符串当作基准前n个字符作为最长公共前缀随后遍历字符串与基准做比较如果不一样则输出最长公共前缀。代码实现char* longestCommonPrefix(char** strs, int strsSize) { //核心思路将第一个字符串当作基准前n个字符作为最长公共前缀 //遍历字符串与基准做比较如果不一样则输出最长公共前缀 //实现 //1.边界值判断和初始化 if(strsSize 0){ char *res (char*)malloc(sizeof(char) * 1); res[0] \0; return res; } //2.以第一个字符串为基准 int first_len strlen(strs[0]); int i; //逐个字符对比 for(i 0; i first_len; i){ char c strs[0][i]; //对比所有字符串 for(int j 1; j strsSize; j){ if(strs[j][i] \0 || strs[j][i] ! c){ char *res (char*)malloc(i 1); strncpy(res, strs[0], i); res[i] \0; return res; } } } //全部匹配malloc返回完整的字符串 char *res (char*)malloc(i 1); strcpy(res, strs[0]); return res; }问题解决1.为什么是strs[j][i]?因为以第一个字符串为基准第i个就是第一个字符串的第几个字符相当于列而j是从零遍历到strsSize相当于第几个字符串就是第几行。2.res[i] \0为什么要写字符串最后一定要加上‘\0’,如果结果没有\0打印会乱码3.为什么要处理“全部匹配”的情况因为当字符串都完全一样的时候最长公共前缀就是其本身这时候循环会直接跑完不返回return我们需要将基准字符串返回4.strncpy(res, strs[0], i)翻译过来就是 把基准字符串strs[0]的前 i 个字符复制到结果 res 里。总结只需要以第一个字符串作为基准作为前缀与后面的字符串进行比较不等时或遍历完时即可找到最长公共前缀。二.5. 最长回文子串题目描述给你一个字符串s找到s中最长的 回文 子串。示例 1输入s babad输出bab解释aba 同样是符合题意的答案。示例 2输入s cbbd输出bb解题思路暴力解法可以利用双指针来判断是否为回文字符串因为回文字符串首尾字符是相同的可以设置一个函数判断其是否为回文字符串。再寻找最长的回文子串即可。中心扩展算法从中心向左右两边扩散只要左右字符相等就是回文代码实现暴力//回文寻找函数 bool Palindrome(char *s, int left, int right){ while(left right){ if(s[left] ! s[right]) return false; left; right--; } return true; } char* longestPalindrome(char* s) { //回文字符串首尾一样 //核心思路不断存入字符串当符合回文寻找函数时满足题意 //回文寻找函数首尾是相同的双指针来遍历即可如果不一样则返回false否则返回true //1.初始化与边界值判断 int len strlen(s); if(len 1){ char *res (char*)malloc(len 1); strcpy(res, s); return res; } int maxLen 1; //最长回文长度最小为1 int start 0; //最长回文起始下标 //2.枚举所有子串的起始位置i for(int i 0; i len; i){ for(int j len - 1; j i; j--){ //判断是否为回文字符串 if(Palindrome(s, i, j)){ int curLen j - i 1; //更新最大长度 if(curLen maxLen){ maxLen curLen; start i; } break; } } } //3.分配结果内存并拷贝 char *res (char*)malloc(maxLen 1); strncpy(res, s start, maxLen); res[maxLen] \0; return res; }中心扩展算法int expandCenter(char *s, int l, int r){ while(l 0 s[l] s[r]){ l--; r; } return r - l - 1; } char* longestPalindrome(char* s) { int len strlen(s); if(len 1){ char *res malloc(len 1); strcpy(res, s); return res; } int start 0, maxLen 0; for(int i 0; i len; i){ int len1 expandCenter(s, i, i); int len2 expandCenter(s, i, i1); int curMax len1 len2 ? len1 : len2; if(curMax maxLen) { maxLen curMax; start i - (maxLen - 1) / 2; } } char *res malloc(maxLen 1); strncpy(res, s start, maxLen); res[maxLen] \0; return res; }总结暴力 分成两部分①找到回文字符串 ②找到最长的回文字符串①利用对撞双指针首尾相同为回文字符串②枚举遍历字符串找出回文字符串与已记录最长长度作比较中心扩展算法从中间开始往两边扩展如果相同则为回文子串同样分成两种①中心为奇数 ②中心为偶数三.67. 二进制求和题目描述给你两个二进制字符串a和b以二进制字符串的形式返回它们的和。示例 1输入:a 11, b 1输出100示例 2输入a 1010, b 1011输出10101解题思路二进制加法分成①无进位 0 0 0 0 1 1 1 0 1 和②有进制 1 1 1加法其实就是两数相加再加上进制我们从右往左加最后翻转即可代码实现char* addBinary(char* a, char* b) { //核心思路从后往前加用carry记录进位每一位计算分成当前位计算加上进位最后存到字符串里 //1.初始化 int lenA strlen(a); int lenB strlen(b); int carry 0; int maxLen lenA lenB ? lenA : lenB; //结果长度最多比最长的多1位 char *res (char*)malloc(maxLen 2); int index 0; //结果数组下标 //从后往前加 int i lenA - 1, j lenB - 1; while(i 0 || j 0 || carry 0){ //取当前位没有了就是0 int bitA (i 0) ? (a[i--] - 0) : 0; int bitB (j 0) ? (b[j--] - 0) : 0;// - 0 从字符转化为数字 //当前位总和 int sum bitA bitB carry; //当前位结果 res[index] (sum % 2) 0; //新的进位 carry sum / 2; } //字符串结束符 res[index] \0; //反转字符串 int left 0, right index - 1; while(left right) { char temp res[left]; res[left] res[right]; res[right] temp; left; right--; } return res; }总结二进制相加从右往左加总和等于当前位之和再加上进制再模2存入结果。
http://www.zskr.cn/news/1387019.html

相关文章:

  • 深入解析 Android 系统启动流程:从开机到应用加载的全面指南
  • PDF 安全防护:打开密码设置与解除方法
  • 手把手教你:把阿里云RDS的物理备份文件(.xb)恢复到本地MySQL 5.7
  • JetPack6.2即ubuntu22.04安装firefox浏览器教程
  • C语言指针01
  • ELKStack高效部署与架构解析
  • 为什么苏州工厂老板都会选择响课教育做GEO优化?一文深度解读!
  • Claude Code 全栈提示词:前端/Java/UI/测试一册通
  • ARM调试状态核心机制与PSTATE处理详解
  • 告别手动选点:cam_lidar_calibration如何用VOQ自动筛选最优标定位姿?
  • 你的图片安全吗?聊聊LSB隐写的‘易碎性’和那些年我们踩过的坑
  • FlashAttention V3 前瞻:下一代Attention优化方向
  • 考研复习 Day 40 | 密码学--第四章 分组密码(中)
  • Linux运维之磁盘分区与挂载详解
  • TVA在电子元器件领域的创新应用(9)
  • 终极指南:如何在Mac上使用Topit实现300%效率提升的窗口置顶
  • 利用Taotoken模型广场为智能CRM选择合适的大模型
  • 技术美术入门必懂:用OpenGL知识反推Unity Shader与渲染管线(实战解析)
  • 低延迟可解释AI模型在实时决策系统中的应用
  • 现代视角下的《周易》浅谈
  • 别再只用ARIMA了!当数据少得可怜时,试试灰色预测GM(1,1)模型(附Python/R代码对比)
  • 避坑指南:Unity 2018/2019 WebGL透明背景设置全流程,解决PostProcess颜色异常
  • Oracle EBS中库存事务是如何影响成本计算的?
  • 2026年4月优秀的冷库设备企业推荐,冷库/冷库机组/冷库制冷设备/冷库安装/保鲜冷库/速冻冷库,冷库设备品牌推荐 - 品牌推荐师
  • YOLOv8传送带缺陷识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)
  • JavaSSM框架从入门到精通!第六天(Spring篇 一)
  • DeepSeek技术方案生成:从“能跑通”到“可交付”的5级成熟度跃迁路径(含Gartner对标矩阵)
  • Cortex-M3/M4调试架构与多节点SWD技术解析
  • ROS1 Action通信避坑指南:手把手教你配置CMakeLists.txt和解决常见编译错误
  • 合肥工商注册代理技术解析及合规服务机构盘点:合肥小规模纳税人代账/合肥注册公司名称核准/合肥注册公司地址挂靠/合肥注册公司材料/选择指南 - 优质品牌商家