字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)

字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)

文章目录

在这里插入图片描述

前言

上篇我们介绍了常用的字符串及其相关原理应用,本篇将结合具体题目,进一步深化对于字符串算法的掌握运用。

第一章:最长公共前缀

1.1 题目链接:https://leetcode.cn/problems/longest-common-prefix/description/

1.2 题目分析:

  • 现给出字符串数组,要求返回所有字符串的最长公共前缀

1.3 思路讲解:

解法⼀(两两⽐较):
我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。\

解法⼆(统⼀⽐较):
题⽬要求多个字符串的公共前缀,我们可以逐位⽐较这些字符串,哪⼀位出现了不同,就在哪⼀位截⽌。

1.4 代码实现:

两两比较代码示例:

classSolution{public: string longestCommonPrefix(vector<string>& strs){// 解法⼀:两两⽐较 string ret = strs[0];for(int i =1; i < strs.size(); i++) ret =findCommon(ret, strs[i]);return ret;} string findCommon(string& s1, string& s2){int i =0;while(i <min(s1.size(), s2.size())&& s1[i]== s2[i]) i++;return s1.substr(0, i);}};

统一比较代码示例:

classSolution{public: string longestCommonPrefix(vector<string>& strs){//所有字符串一起 逐个比较 string ret=strs[0];for(int i=0;i<ret.size();i++){char temp=strs[0][i];for(int j=1;j<strs.size();j++){if(i==strs[j].size()||temp!=strs[j][i]){return ret.substr(0,i);}}}return ret;}};

第二章:最长回文子串

2.1 题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/

2.2 题目分析:

题目要求找出字符串s中的最长回文子串,我们先来回顾一下什么是回文串

回文串:即正反形式相同的字符串,例如aba

2.3 思路讲解:

本题我们可以采用中心拓展算法

  • 对于⼀个⼦串⽽⾔,如果它是回⽂串,并且⻓度⼤于 2,那么将它⾸尾的两个字⺟去除之后,它仍然是个回⽂串。如此这样去除,⼀直除到⻓度⼩于等于 2 时呢?⻓度为 1 的,⾃⾝与⾃⾝就构成回⽂;⽽⻓度为 2 的,就要判断这两个字符是否相等了。
  • 从这个性质可以反推出来,从回⽂串的中⼼开始,往左读和往右读也是⼀样的。那么,是否可以枚举回⽂串的中⼼呢?
  • 从中⼼向两边扩展,如果两边的字⺟相同,我们就可以继续扩展;如果不同,我们就停⽌扩展。
  • 这样只需要⼀层 for 循环,我们就可以完成先前两层 for 循环的⼯作量。

2.4 代码实现:

classSolution{public: string longestPalindrome(string s){int n=s.size();int left=0,right=0,len=0,begin=0;for(int i=0;i<n;i++){//奇数次拓展 left=i,right=i;while(left>=0&&right<n&&s[left]==s[right]){ left--; right++;}if(right-left-1>len){ begin=left+1; len=right-left-1;}//偶数次拓展 left=i,right=i+1;while(left>=0&right<n&&s[left]==s[right]){ left--; right++;}if(right-left-1>len){ begin=left+1; len=right-left-1;}}return s.substr(begin,len);}};

第三章:二进制求和

3.1 题目链接:https://leetcode.cn/problems/add-binary/description/

3.2 题目分析:

  • 题目给出两个只包含二进制数字的字符串,要求返回其按二进制运算规则相加的和
  • 该和用字符串表示

3.3 思路讲解:

模拟⼗进制中我们列竖式计算两个数之和的过程。但是这⾥是⼆进制的求和,我们不是逢⼗进⼀,⽽是逢⼆进⼀。

3.4 代码实现:

classSolution{public: string addBinary(string a, string b){int cur1=a.size()-1,cur2=b.size()-1; string ret="";//返回的字符串int t=0;//进位while(cur1>=0||cur2>=0||t){if(cur1>=0){ t+=a[cur1--]-'0';}if(cur2>=0){ t+=b[cur2--]-'0';} ret+=t%2+'0'; t/=2;}reverse(ret.begin(),ret.end());return ret;}};

第四章:字符串乘法

4.1 题目链接:https://leetcode.cn/problems/multiply-strings/description/

4.2 题目分析:

  • 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
  • 观察字符串长度范围,首先排除正常乘法,因为其值大小远超long long所能表示的范围

4.3 思路讲解:

整体思路就是模拟我们⼩学列竖式计算两个数相乘的过程。但是为了我们书写代码的⽅便性,我们选择⼀种优化版本的,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。如下图:

在这里插入图片描述

4.4 代码实现:

classSolution{public: string multiply(string num1, string num2){int m=num1.size(),n=num2.size(); string ret="";int len=m+n-1;reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());//先逆序两个字符串//不进位的乘法 vector<int>temp(len);for(int i=0;i<m;i++){for(int j=0;j<n;j++){ temp[i+j]+=(num1[i]-'0')*(num2[j]-'0');//此处注意是+=}}//处理进位int t=0,cur=0;while(cur<len||t){if(cur<len){ t+=temp[cur++];} ret+=t%10+'0'; t/=10;}//处理前导0while(ret.size()>1&&ret.back()=='0'){ ret.pop_back();}reverse(ret.begin(),ret.end());return ret;}};

尾声:字里行间的永恒智慧

字符串算法,如同文字的魔法,将字符编织成信息的纽带。从暴力匹配到前缀树,从压缩算法到加密技术,它展示了算法的艺术与科学的结合。在未来的旅程中,字符串算法将继续书写信息时代的传奇,为人类探索未知的语言和数据世界提供智慧的钥匙。

本篇关于字符串算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

在这里插入图片描述

Read more

Spring Boot 开发环境快速搭建:Java + Maven + IDEA 配置一步到位

定位:面向零基础入门开发者,解决环境配置卡壳问题,全程图文步骤 + 避坑指南,确保 10 分钟内搭好可运行的 Spring Boot 基础环境。 一、引言 新手入门 Spring Boot 最头疼的就是 “环境配置”:Java 版本选错导致项目启动失败、环境变量配不对提示 “不是内部命令”、Maven 仓库下载慢卡半天、IDEA 插件缺失无法创建项目…… 本文从 “工具安装→配置→项目实战” 全程拆解,每一步都附操作截图和避坑提示,跟着做就能顺利跑通第一个 Spring Boot 项目。 二、第一步:安装 JDK 并配置环境变量(关键!) 2.1 版本选择与下载 * 推荐版本:JDK 17(Spring Boot

By Ne0inhk
Java 连接 Elasticsearch 8.x 安全模式实战:证书校验与 ApiKey 认证全解析

Java 连接 Elasticsearch 8.x 安全模式实战:证书校验与 ApiKey 认证全解析

引言 Elasticsearch 8.x 版本迎来了一个重大的安全变革:默认开启安全特性(Security Features)。这意味着,当你安装好 ES 8.x 后,不再像以往那样可以直接通过 http://localhost:9200 匿名访问。集群默认强制启用 HTTPS (TLS/SSL) 加密传输,并要求进行身份认证。 对于 Java 开发者而言,这带来了一个直接的挑战:如何在代码中正确处理自签名证书(CA Certificate)并完成认证?如果处理不当,你会频繁遇到 SSLHandshakeException: PKIX path validation failed 或 unable to find valid certification path to requested target

By Ne0inhk
【JAVA 进阶】SpringBoot自动配置机制:从原理到实践的深度解析

【JAVA 进阶】SpringBoot自动配置机制:从原理到实践的深度解析

文章目录 * 前言 * 第一章 初识SpringBoot自动配置 * 1.1 自动配置的定义 * 1.2 自动配置的核心价值 * 1.2.1 降低开发门槛 * 1.2.2 提高开发效率 * 1.2.3 保证配置一致性 * 1.3 自动配置与传统Spring配置的对比 * 1.3.1 传统Spring Web配置(Spring 4.x及之前) * 1.3.2 SpringBoot自动配置实现 * 第二章 深入原理:SpringBoot自动配置是如何实现的 * 2.1 核心注解:@SpringBootApplication的“三位一体” * 2.1.1 @SpringBootConfiguration:标识配置类

By Ne0inhk
基于java 员工理系统设计与实现

基于java 员工理系统设计与实现

博主介绍:翰文编程 专注于Java(springboot ssm 等开发框架) vue  .net  php phython node.js    uniapp 微信小程序 等诸多技术领域和课设项目实战、企业信息化系统建设,从业十八余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了2000+题目解决方法案例  方便大家学习使用 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 文末下方有源码获取地址 通过分析员工管理系统相似系统功能要求,总结本系统的主要功能 本系统模块实现功能如下: (1)员工管理:对员工信息进行添加、删除、修改和查看 (2)员工评语管理:对员工评语信息进行添加、删除、修改和查看 (3)奖金管理:对奖金信息进行添加、删除、修改和查看 (4)社保记录管理:对社保记录信息进行添加、删除、修改和查看

By Ne0inhk