PHP 求解两字符串所有公共子序列及最长公共子序列 支持多字节字符串


/*** 获取两字符串所有公共子序列【不连续的】 例:abc ac => ac** @param string $str1 字符串1* @param string $str2 字符串2** @return array*/
function public_sequence(string $str1, string $str2): array
{$data = [[-1, -1, '', 0, '']]; // 子序列容器【横坐标 纵坐标 当前子序列 长度 足迹】$arr  = []; // 动态规划容器$arr1 = mb_str_split($str1);$arr2 = mb_str_split($str2);$len1 = count($arr1);$len2 = count($arr2);// 动态规划for ($y = 0; $y < $len2; ++$y) {for ($x = 0; $x < $len1; ++$x) {$arr[$y][$x] = $arr1[$x] === $arr2[$y] ? 1 : 0;e($arr[$y][$x], 'n'); // 打印数据}e(); // 换行}// 寻找所有子序列$len = $len1 > $len2 ? $len1 : $len2;for ($i = 0; $i < $len; ++$i) {foreach ($data as &$value) {++$value[0]; // 横坐标++$value[1]; // 纵坐标$len = $value[3] + 1; // 长度// 纵坐标固定,横坐标增加,检验横行数据for ($x = $value[0]; $x < $len1; ++$x) {if ($value[1] >= $len2) break;if ($arr[$value[1]][$x] === 1) $data[] = [$x, $value[1], $value[2] . $arr1[$x], $len, $value[4] . '(' . $x . ',' . $value[1] . ')'];}// 横坐标固定,纵坐标增加,检验纵行数据for ($y = $value[1] + 1; $y < $len2; ++$y) {if ($value[0] >= $len1) break;if ($arr[$y][$value[0]] === 1) $data[] = [$value[0], $y, $value[2] . $arr2[$y], $len, $value[4] . '(' . $value[0] . ',' . $y . ')'];}}}return $data;
}/*** 获取两字符串所有最长公共子序列 注意:最长字符串子序列可能有多个** @param string $str1 字符串1* @param string $str2 字符串2** @return array*/
function long_public_sequence(string $str1, string $str2): array
{$data = []; // 最长子序列容器$tmp  = []; // 临时子序列容器$len = 0; // 最长子序列长度// 获取所有公共子序列$subsequence = public_sequence($str1, $str2);// 找到最长子序列长度及个数foreach ($subsequence as $value) {if ($len > $value[3]) continue;$len = $value[3];$tmp[] = $value;}// 根据最长子序列长度筛选数据foreach ($tmp as $value) {if ($len === $value[3]) $data[] = $value;}return $data;
}$str1 = '安保处的';
$str2 = '安保的';v(public_sequence($str1, $str2));
vd(long_public_sequence($str1, $str2));

执行结果:

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

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

相关文章

配置Arduino+ESP32走过的巨坑

项目场景&#xff1a; 前几天去淘宝买了块ESP32拿来用&#xff0c;配置Arduino最新版ESP32 2.0.11走过的巨坑。 问题描述 先安装好了ArduinoIDE最新版&#xff08;教程里介绍去官网下&#xff09;&#xff0c;然后配置ESP32开发板&#xff0c;后面发现安装速度惊人。 去找加速…

Pytorch深度学习-----完整神经网络模型训练套路

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

git 使用步骤

1、创建分支 git checkout -b cate 2、本地提交 将 cate 分支进行本地提交 git add . git commit -m "完成cate页面的开发" 3、远程推送 将本地的 cate 分支推送到码云 git push -u origin cate 4、合并本地分支 将本地 cate 分支中的代码合并到 master 主分支&am…

websocket知识点

http协议 http协议特点&#xff1a; 无状态协议每个请求是独立的单双工通信&#xff0c;且服务器无法主动给客户端发信息http协议受浏览器同源策略影响 http实现双向通信方法: 轮询长轮询iframe流sse EventSource websocket协议 websocket协议: 全双工协议支持跨域支持多…

自动测试框架airtest应用一:将XX读书书籍保存为PDF

一、Airtest的简介 Airtest是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。Airtest的框架是网易团队自己开发的一个图像识别框架&#xff0c;这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。Sikuli这个框架的原理是这样的&#xff0c;计算机用户不需要…

asp.net core webapi如何执行周期性任务

使用Api执行周期性任务 第一种&#xff0c;无图形化界面1.新建类&#xff0c;继承IJob&#xff0c;在实现的方法种书写需要周期性执行的事件。2.编写方法类&#xff0c;定义事件执行方式3.在启动方法中&#xff0c;进行设置&#xff0c;.net 6中在program.cs的Main方法中&#…

数据库--MySQL增删改查

数据库相关链接&#xff1a; 数据库--数据类型&#xff1a;http://t.csdn.cn/RtqMD 数据库--三大范式、多表查询、函数sql&#xff1a;http://t.csdn.cn/udJSG 基础的数据操作 在创建了数据库和数据库表之后&#xff0c;我们就可以在表中进行数据操作了。基础操作分为 添加 …

旅卦-火山旅

前言&#xff1a;人生就像一趟旅行&#xff0c;为谋生奔波也是旅&#xff0c;旅是人生的常态&#xff0c;我们看一下易经里的旅卦&#xff0c;分析下卦辞和爻辞以及自己的理解。 目录 卦辞 爻辞 总结 卦辞 旅&#xff1a;小亨&#xff0c;旅贞吉。 卦序&#xff1a;穷大者…

java获取到heapdump文件后,如何快速分析?

简介 在之前的OOM问题复盘之后&#xff0c;本周&#xff0c;又一Java服务出现了内存问题&#xff0c;这次问题不严重&#xff0c;只会触发堆内存占用高报警&#xff0c;没有触发OOM&#xff0c;但好在之前的复盘中总结了dump脚本&#xff0c;会在堆占用高时自动执行jstack与jm…

560. 和为 K 的子数组

思路 本题的主要思路为创建一个哈希表记录每个0~i的和&#xff0c;在遍历这个数组的时候查询有没有sum-k的值在哈希表中&#xff0c;如果有&#xff0c;说明有个位置到当前位置的和为k。   有可能不止一个&#xff0c;哈希表负责记录有几个sum-k&#xff0c;将和记录下来。这…

java -复习

数组存储数据方面的特点和弊端 数组一旦初始化&#xff0c;其长度就是确定的。数组中的多个元素是依次紧密排列的&#xff0c;有序的&#xff0c;可重复的(优点)数组一旦初始化完成&#xff0c;其元素的类型就是确定的。不是此类型的元素&#xff0c;就不能添加到此数组中。in…

【ArcGIS Pro二次开发】(60):按图层导出布局

在使用布局导图时&#xff0c;会遇到如下问题&#xff1a; 为了切换图层和导图方便&#xff0c;一般情况下&#xff0c;会把相关图层做成图层组。 在导图的时候&#xff0c;如果想要按照图层组进行分开导图&#xff0c;如上图&#xff0c;想导出【现状图、规划图、管控边界】3…

UNIX网络编程——TCP协议API 基础demo服务器代码

目录 一.TCP客户端API 1.创建套接字 2.connect连接服务器​编辑 3.send发送信息 4.recv接受信息 5.close 二.TCP服务器API 1.socket创建tcp套接字(监听套接字) 2.bind给服务器套接字绑定port,ip地址信息 3.listen监听并创建连接队列 4.accept提取客户端的连接 5.send,r…

包管理工具详解npm 、 yarn 、 cnpm 、 npx 、 pnpm(2023)

1、包管理工具npm &#xff08;1&#xff09;包管理工具npm&#xff1a; Node Package Manager&#xff0c;也就是Node包管理器&#xff1b;但是目前已经不仅仅是Node包管理器了&#xff0c;在前端项目中我们也在使用它来管理依赖的包&#xff1b;比如vue、vue-router、vuex、…

【Spring中MySQL连接错误】Cannot load driver class: com.mysql.cj.jdbc.Driver

Caused by: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method ‘dataSource’ threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.mysql.cj.jdbc.Driver Caused by: java.lang.IllegalState…

干货满满的Python知识,学会这些你也能成为大牛

目录 1. 爬取网站数据 2. 数据清洗与处理 3. 数据可视化 4. 机器学习模型训练 5. 深度学习模型训练 6. 总结 1. 爬取网站数据 在我们的Python中呢&#xff0c;使用爬虫可以轻松地获取网站的数据。可以使用urllib、requests、BeautifulSoup等库进行数据爬取和处理。以下是…

(kubernetes)k8s常用资源管理

目录 k8s常用资源管理 1、创建一个pod 1&#xff09;创建yuml文件 2&#xff09;创建容器 3&#xff09;查看所有pod创建运行状态 4&#xff09;查看指定pod资源 5&#xff09;查看pod运行的详细信息 6&#xff09;验证运行的pod 2、pod管理 1&#xff09;删除pod 2…

校验 GPT-4 真实性的三个经典问题:快速区分 GPT-3.5 与 GPT-4,并提供免费测试网站

现在已经有很多 ChatGPT 的套壳网站&#xff0c;以下分享验明 GPT-4 真身的三个经典问题&#xff0c;帮助你快速区分套壳网站背后到底用的是 GPT-3.5 还是 GPT-4。 大家可以在这个网站测试&#xff1a;https://ai.hxkj.vip&#xff0c;免登录可以问三条&#xff0c;登录之后无限…

“深入解析JVM:探索Java虚拟机的工作原理和优化技巧“

标题&#xff1a;深入解析JVM&#xff1a;探索Java虚拟机的工作原理和优化技巧 摘要&#xff1a;Java虚拟机&#xff08;JVM&#xff09;作为Java语言的核心&#xff0c;承担着将Java字节码转化为可执行代码的重要任务。本文将深入探索JVM的工作原理和优化技巧&#xff0c;帮助…

STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

作为一名大学生&#xff0c;学习单片机有一段时间了&#xff0c;也接触过嵌入式ARM的开发&#xff0c;但从未使用以及接触过STM32C8T6大开发使用&#xff0c;于是从今日开始&#xff0c;将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题&#xff0c;STM32C8T6单片…