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

KMP算法基础

文章一览

  • 前言
  • 一、核心思想
  • 二、实现步骤
  • 三、图解实现
  • 四、next数组的实现
  • 总结

前言

本栏目将讲解在学习过程中遇到的各种常用算法,深入浅出的讲解算法的用法与使用场景。
那么话不多说,让我们进入第一个算法KMP算法吧!

一、核心思想

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,用于在一个文本字符串中搜索一个模式字符串的出现。
它的核心思想是,当不匹配发生时,利用已经匹配的部分信息,避免从头开始搜索,从而提高搜索效率。
借用在B站看到的某位网友的评论:“一个人能能走的多远不在于他在顺境时能走的多快,而在于他在逆境时多久能找到曾经的自己。”
这就是KMP算法的核心思想,看起来有点迷糊,那么继续往下看,了解了它的基本用法后,相信你会对它有更加深刻的理解。

二、实现步骤

KMP算法的步骤大致如下:

  1. 模式匹配失败时的处理
  • 通常情况下,当出现不匹配时,模式会向右移动一个位置,重新开始匹配。但KMP算法会利用已经匹配的部分信息,决定模式应该向右移动多远。
  1. 前缀函数(也称为部分匹配表)
  • KMP算法使用一个被称为“部分匹配表”(next function)的数据结构来记录模式字符串中每个位置之前的子串的最长相同前后缀的长度。这个表帮助算法在出现不匹配时,决定模式字符串应该向右移动多远。
  1. 搜索过程
  • 遍历文本字符串,将模式字符串与文本字符串进行匹配。
  • 如果当前字符匹配成功,则模式字符串向右移动一位。
  • 如果出现不匹配,根据部分匹配表,决定模式字符串应该向右移动多远,而不是简单地移动一位。

三、图解实现

在这里插入图片描述
KMP算法的关键点在于这种情况出现时该如何处理,如果是暴力搜索,这时候需要重置原串中的指针到第二个位置,再重新匹配,算法的复杂度是o(m*n),而KMP算法可以优化暴力搜索,让原串中的指针只往后走,而不回来重复走。
我们观察到如果说字串中的指针向后走了,说明前面的位置是被匹配到了,我们可以设法利用前面已经在原串中匹配的字符,这样原串中的指针就只需要往后走,而不用往回走,将复杂度降到o(n)。
那么我们如何利用已经匹配过的字串呢?
在这里插入图片描述
在字串中,我们观察到,它的串中有重复的字符出现,所以才导致了可能需要从原串中回退,如果我们定义了一个数组记录好子串中每个字符对应的重复的位置在哪里,如下图所示:
在这里插入图片描述
这样的话,当我们发现,匹配到后面无法匹配时,我们需要让字串的指针回退到上一个位置的对应的重复的位置。
在这里插入图片描述
然后继续跟原串匹配,这里我们知道原来的字串位置之前的所有字符都被匹配了,所以需要找到与字串当前位置末尾的字符串相同的最长前缀字串,就可以接着匹配(这里不理解可以接着往后看)。
在这里插入图片描述
继续向后匹配
在这里插入图片描述
直到完成匹配,或者是找完原串没有匹配并返回。
看着流程很简单,也很容易理解,但是最难的地方在于next数组到底是什么?该如何实现呢?
首先,回答一下next数组是什么。
next数组实事上是字串的前缀字串与后缀字串的最长匹配长度,注意这里需要定义自身不是自身的匹配,因为如果自己是那么最长的匹配长度永远是自己的长度,那么再返回来匹配,还是要与现在指针指向的字符去匹配是没有意义的。也就是说这里的前后缀是指不包括尾(或首)字符的最大匹配长度,既最小长度需要为2,只有一个字符时的长度为0。
举几个例子方便理解
在这里插入图片描述
看这个例子可以很容易理解next数组的定义,所以上上面在遇到不匹配的字符,并且字串中有被匹配到的字符时,我们需要返回上一个字符的最大匹配处,再继续往后匹配。
所谓的前缀字串就是从第一个位置往后,不包括最后一个字符的所有字符串,后缀字串同理,这个从现在的用法来看就很容易理解啦!
我们现实现一下遍历,后面再讲解next数组的形成。

bool kmp(string str, string substr)
{int* next = buildNext(substr);int i = 0, j = 0;while (i<str.length()){//字符被匹配时继续向后匹配if (str[i] == substr[j]){i++;j++;}//字串有被匹配时else if (j > 0){j = next[j - 1];}//字串没有被匹配时else{i++;}if (j == substr.length()){break;}}delete[] next;//这里是为了销毁动态数组if (j == substr.length()){return true;}return false;
}void call()
{string str, substr;cin >> str;cin >> substr;kmp(str, substr);
}int main()
{call();return 0;
}

四、next数组的实现

next数组的实现是此算法的重点,我们前面已经看到了它实现的过程,如果让我们自己去写出这个数组是非常简单的,但是计算机如何实现呢
我们可以定义一个变量来存储当前的最大匹配长度prefix_len,给它赋初值为0,这里需要回想一下,我们定义的前缀数组一定是从第一个字符开始的,所以说prefix_len 刚好可以记录当前匹配的字符数,也可以作为一个指针,非常契合后续遍历时的使用;
同样的next[0] 应该初始化为0;
定义一个位置指针从字符串的第二个字符开始,往后走,每走一下判断是否与prefix_len位置的指针所指向的字符匹配,有三种情况:

  1. 如果匹配,prefix_len +1,令next的值为prefix_len, 并且位置指针向后移一位;
  2. 如果不匹配,且prefix_len 为0, 说明没有匹配的字符,直接把位置指针后移即可;
  3. 难的是这种情况,不匹配但是prefix_len 不为0,说明之前有匹配项了,这时候可能会有匹配的情况出现,我们分析一下:

在这里插入图片描述
根据前两种情况,到这里时,prefix_len = 1,pos = 2, 接下来pos指针往后走;
在这里插入图片描述
现在发现,不匹配,且prefix_len不等于0,我们应该怎么办呢?有些
铁铁可能会说很简单,给prefix_len 赋0就可以,然后pos往后走,那么在这里确实是可以的,但是我们往后再看看;
在这里插入图片描述
来到这里之后再往后走;
在这里插入图片描述
现在还是不匹配,且prefix_len 不为0,若是把它赋为0,就不对了;
在这里插入图片描述
我们可以看到它应该是2,我们应该怎么办呢?
观察上图我们发现,其实目前pos的值与prefix_len-1,既它的前一个位置是有关的,与KMP的思想一样,因为prefix_len 不为0说明前面的prefix_len个字符是被匹配好的,我们可以利用它,看看更短的字串有没有匹配的,令prefix_len = next[prefix_len-1],再去与当前的pos匹配。这样就很好的解决了问题。同时,也解决了想赋给0的情况。
在这里插入图片描述
在这里插入图片描述
代码实现如下

#include<iostream>
#include <cstring>
using namespace std;int* buildNext(string str)
{int* next = new int[str.length()];next[0] = 0;int prefix_len = 0;int i = 1;while (i < str.length()){if (str[prefix_len] == str[i]){prefix_len++;next[i] = prefix_len;i++;}else{if (prefix_len == 0) { next[i] = 0; i++;}else{prefix_len = next[prefix_len - 1];}}}/*for (int i = 0; i < str.length(); i++){cout << next[i] << " ";}cout << endl;*/return next;
}
//基础学习
bool kmp(string str, string substr)
{int* next = buildNext(substr);int i = 0, j = 0;while (i<str.length()){if (str[i] == substr[j]){i++;j++;}else if (j > 0){j = next[j - 1];}else{i++;}if (j == substr.length()){cout << "true" << endl;break;}}delete[] next;if (j == substr.length()){return true;}cout << "false" << endl;return false;
}void call()
{string str, substr;cin >> str;cin >> substr;kmp(str, substr);
}int main()
{call();return 0;
}

那么你学会了吗?

总结

KMP算法是查找字串的一个优化算法,我个人在学习过程中感觉比较难理解的是next数组的迭代,没有看懂的铁铁可以找视频看看,再写写代码,这个代码是我自己写,可能有些冗余大家可以根据思想自己实现更好的代码。另外,欢迎大家在评论区讨论,一起学习。

相关文章:

KMP算法基础

文章一览 前言一、核心思想二、实现步骤三、图解实现四、next数组的实现总结 前言 本栏目将讲解在学习过程中遇到的各种常用算法&#xff0c;深入浅出的讲解算法的用法与使用场景。 那么话不多说&#xff0c;让我们进入第一个算法KMP算法吧&#xff01; 一、核心思想 KMP&am…...

C语言——实现百分制换算为等级分

问题描述&#xff1a;百分制换算为等级分 //百分制换算为等级分#include<stdio.h>void my_function(int x) {if(x>95 && x<100){printf("A");}else if(x>81 && x<94){printf("B");}else if(x>70 && x<8…...

@pytest.fixture() 跟 @pytest.fixture有区别吗?

在iOS UI 自动化工程里面最早我用的是pytest.fixture()&#xff0c;因为在pycharm中联想出来的fixture是带&#xff08;&#xff09;的&#xff0c;后来偶然一次我没有带&#xff08;&#xff09;发现也没有问题&#xff0c;于是详细查了一下pytest.fixture() 和 pytest.fixtur…...

docker run命令大全

docker run命令大全 基本语法常用选项基础选项资源限制网络配置存储卷和挂载环境变量重启策略其他高级选项示例总结docker run 命令是 Docker 中最常用和强大的命令之一,用于创建并启动一个新的容器。该命令支持多种选项和参数,可以满足各种使用场景的需求。以下是 docker ru…...

BootAnimation源码流程分析

BootAnimation流程 bootanimation源码位于frameworks/base/cmds/bootanimation&#xff0c;正如其名&#xff0c;主要功能是加载播放开机动画&#xff0c;是一个C程序&#xff0c;编译生成的可执行文件位于/system/bin 主要逻辑&#xff1a;解析系统路径下的bootanimation.zi…...

Vue前端开发-数据缓存

完成全局性的axios实例对象配置后&#xff0c;则可以在任意一个组件中直接调用这个对象&#xff0c;发送异步请求&#xff0c;获取服务端返回的数据&#xff0c;同时&#xff0c;针对那些不经常变化的数据&#xff0c;可以在请求过程中&#xff0c;进行数据缓存&#xff0c;并根…...

唯品会Android面试题及参考答案

HTTP 和 HTTPS 的区别是什么&#xff1f;你的项目使用的是 HTTP 还是 HTTPS&#xff1f; HTTP 和 HTTPS 主要有以下区别。 首先是安全性。HTTP 是超文本传输协议&#xff0c;数据传输是明文的&#xff0c;这意味着在数据传输过程中&#xff0c;信息很容易被窃取或者篡改。比如&…...

ARM CCA机密计算安全模型之固件启动

安全之安全(security)博客目录导读 目录 1、安全启动(Verified boot) 2、镜像格式和签名方案 3、防回滚 4、离线启动(Off-line boot) 5、CCA HES固件启动流程 6、CCA系统安全域启动过程 7、应用程序PE启动过程 8、稳健性 本节定义了将CCA固件引导至可证明状态的要…...

LeetCode:3376. 破解锁的最少时间 I(DFS回溯 Java)

目录 3376. 破解锁的最少时间 I 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 3376. 破解锁的最少时间 I 题目描述&#xff1a; Bob 被困在了一个地窖里&#xff0c;他需要破解 n 个锁才能逃出地窖&#xff0c;每一个锁都需要一定的 能量 …...

利用编程获得money?

在当今数字化时代&#xff0c;编程技能为人们开辟了众多赚钱途径。无论你是编程新手还是经验丰富的开发者&#xff0c;都能在广阔的市场中找到适合自己的盈利方式。以下是一份详细的用编程赚钱指南。 一、自由职业平台 像 Upwork、Freelancer 和 Fiverr 等知名自由职业平台&am…...

51c视觉~合集36

我自己的原文哦~ https://blog.51cto.com/whaosoft/12275223 #无监督盲超分算法MLMC 即插即用的解决方案 本文介绍了一种新的无监督盲超分辨率算法MLMC&#xff0c;该算法结合了元学习和马尔可夫链蒙特卡罗核估计&#xff0c;无需监督预训练或参数先验&#xff0c;即可实现…...

域名系统_域名展示出售系统 PC+H5 双端自适应页面

域名系统_域名展示出售系统 PCH5 双端自适应页面 PCH5 双端自适应页面 " 是一套专门用于域名展示和出售的系统源代码 它包含 PC 端和 H5 移动端两个版本&#xff0c;确保在不同设备上都能提供良好的用户体验 这套系统不仅具备基本的域名展示功能&#xff0c;还注重设计…...

Linux C/C++编程的线程结束

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…...

户口本识别、接口识别、python户口本文字识别集成

文字识别技术是数字化转型中一项重要的信息处理手段&#xff0c;正在改变政府机构、企业及个人用户之间的交互方式。通过先进的OCR&#xff08;光学字符识别&#xff09;技术和AI算法的支持&#xff0c;户口本识别不仅简化了信息采集流程&#xff0c;还提高了数据的准确性。 随…...

王佩丰24节Excel学习笔记——第十一讲:Vlookup函数

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 掌握vlookup使用方法&#xff0c;选区的第一列一定是查询参数条件一。使用通配符查询。vlookup 限 255 位长度。掌握日常使用场景。使用vlookup模糊匹配查询个税 一、使用Vlookup函…...

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…...

Upload-labs 靶场(通关攻略)

WebShell 一句话木马: <?php eval($_POST[a])?> <?php system($_POST[a])?> 第一关&#xff08;删除前端js校验&#xff09; 删除return checkFile() 就能上传成功 第二关(抓包文件类型校验) BP抓包修改后缀 改为2.php后放行 第三关(上传php同种类型的不…...

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…...

TRELLIS,一键生成3D模型,图像转3D,微软开源

大家好&#xff01;今天给大家分享微软最近开源的一个3D模型生成项目——TRELLIS。简单来说就是输入一张图片&#xff0c;它就能自动帮你生成3D模型。这与之前分享的TripoSR项目类似&#xff0c;但是精度和贴图细节比TripoSR要高很多。 好久没关注AI生成3D模型这块&#xff0c;…...

【JavaEE进阶】关于Maven

目录 &#x1f334;什么是Maven &#x1f332;为什么要学Maven &#x1f38d;创建一个Maven项目 &#x1f384;Maven核心功能 &#x1f6a9;项目构建 &#x1f6a9;依赖管理 &#x1f38b;Maven Help插件 &#x1f340;Maven 仓库 &#x1f6a9;本地仓库 &#x1f6a…...

泷羽sec学习打卡-powershell的灵魂

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于powshell的那些事儿-玩转powershell 什么是powershell&#xff1f;什么是cmd&#xff1f;powershel…...

利用Map集合设计程序,存储城市和对应等级相关信息

package testmap;import java.util.HashMap; import java.util.Scanner; import java.util.Set;public class TestHashMap6 {public static void main(String[] args) {//1.创建一个Map集合&#xff1a;存储键值对HashMap<String, String> map new HashMap<>();/…...

【数字图像处理】期末综合知识点总结 ver1,灰度图像,图像增强,平滑滤波,锐化滤波,图像复原,图像压缩

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

GIN

gin是什么 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。如果你需要极好的性能&#xff0c;使用 Gin 吧。 特点&#xff1a;gin是golang的net/http库封装的web框架&#xff0c;api友好&#xff0c;注…...

Java中通过ArrayList扩展数组

在Java中&#xff0c;ArrayList 是一个动态数组实现&#xff0c;能够根据需要自动调整其大小。与传统的数组不同&#xff0c;ArrayList 不需要预先指定大小&#xff0c;并且提供了许多方便的方法来操作集合中的元素。下面将详细介绍如何使用 ArrayList 进行数组的扩展&#xff…...

2024.12.19总结

今天跑了数据采集和端口扫描&#xff0c;对于容器化和虚拟机的概念不是很理解。然后是北向接口文档&#xff0c;在跟其他人交流时&#xff0c;问原理把我给问住了。在安全这块&#xff0c;要学的的东西很多&#xff0c;确实不是三五个月就能搞定的事。 如今&#xff0c;我要做…...

upload-labs靶场通过攻略

upload-labs靶场 第一关 删除前端js校验 return checkFile() 就能上传成功 第二关(抓包文件类型校验) BP抓包修改后缀 第三关(上传php同种类型的不同后缀) 根据源码发现这关的黑名单不太严谨,我们就可以使用php同种类型的不同后缀 第四关(双上传) 根据源码发现这些后缀的…...

【信息系统项目管理师-论文真题】2017下半年论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一:论信息系统项目的安全管理写作要点解题思路1、访问控制工具与技术2、加密技术3、安全检测与监控工具4、安全策略制定与文档化:5、数据备份与恢复技术试题二:论信息系统项目的成本管理写作要点解题思路…...

运维 mysql、redis 、RocketMQ性能排查

MySQL查看数据库连接数 1. SHOW STATUS命令-查询当前的连接数 MySQL 提供了一个 SHOW STATUS 命令&#xff0c;可以用来查看服务器的状态信息&#xff0c;包括当前的连接数。 SHOW STATUS LIKE Threads_connected;这个命令会返回当前连接到服务器的线程数&#xff0c;即当前…...

使用 rvest 包快速抓取网页数据:从入门到精通

介绍 随着大数据和数据科学的迅速发展&#xff0c;互联网数据的抓取已经成为重要的信息获取手段之一。网页抓取&#xff08;Web Scraping&#xff09;可以帮助我们自动化地从网页中提取有价值的数据&#xff0c;应用广泛&#xff0c;包括新闻热点分析、金融数据采集等。在本篇…...

青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序

青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序 课题摘要:一、Web应用程序二、Web服务器&#xff08;一&#xff09;什么是Web服务器&#xff08;二&#xff09;Web服务器配置1. 选择服务器软件2. 安装服务器软件3. 配置服务器4. 安全设置5. 部署网站内容6. 测试服…...

MybatisPlus(四)

五、条件构造器和常用接口 1、wapper介绍 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; 查询条件封装 UpdateWrapper &#xff1a; Update 条件封…...

经典电荷泵/Charge pump——1998.JSSC

电路结构 工作原理 M3 and M4 are the series switches, and M5, M6 switch to the highest voltage. If M5 and M6 are missing, having a large capacitor is of absolute necessity, because must always stay between 2 Vin and 2Vin - Uj to avoid switching on the vert…...

搭建MongoDB

title: 搭建MongoDB date: 2024-11-30 23:30:00 categories: - 服务器 tags: - MongoDB - 大数据搭建MongoDB 环境&#xff1a;Centos 7-2009 1. 创建MongoDB的国内yum源 # 下载Centos7对应最新版7.0.15的安装包 cat >> /etc/yum.repos.d/mongodb.repo << &quo…...

2FA双因子验证技术实现原理

一、背景 随着关注数据安全的意识逐步提升&#xff0c;很多站点都开始强制用户不止使用用户名密码的形式进行登录&#xff0c;还会逐步引导用户开启2FA多因子验证。 Github就已经强制用户使用2FA多因子验证进行账号的登录&#xff0c;现在阿里云、腾讯云等也逐步往这个方向发展…...

boost之bind

简介 用于构造函数对象&#xff0c;其定义在文件bind.hpp中 bind 其底层使用通用的模板类bind_t template<class R, class F, class L> class bind_t { public:typedef bind_t this_type;bind_t(F f, L const & l): f_(f), l_(l) {}#define BOOST_BIND_RETURN re…...

simpleperf生成火焰图的步骤

1. simpleperf 命令抓取.data文件 adb shell simpleperf record --duration 30 -g -p 8734 --trace-offcpu --clockid monotonic -e cpu-clock -o /data/local/tmp/perf.data C:\Users\fadi.su>adb shell simpleperf record --duration 30 -g -p 8734 --trace-offcpu --cl…...

拥有人类情感的AI:未来还是幻想?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

EAS的KDTextField 添加回车事件监听

1、控件绑定一个action&#xff08;可以在ui上配置&#xff09; 2、因为GUI设置的统一的控件切换键为TAB和ENTER两个&#xff0c;所以需要单独设置这个控件的切换键。 Set<KeyStroke> set new HashSet<KeyStroke>(); set.add(KeyStroke.getKeyStroke(KeyEvent.VK_…...

【Linux】Macvlan介绍及LInux下例子实现

Macvlan Macvlan 是一种网络虚拟化技术&#xff0c;允许在同一物理网络接口上创建多个虚拟网络接口&#xff0c;每个虚拟接口都有自己独立的 MAC 地址。这对于需要在同一物理主机上运行多个网络隔离的应用程序或容器时非常有用。 Macvlan 的特点和用途 独立的 MAC 地址 每个 …...

Kafka Streams 在监控场景的应用与实践

作者&#xff1a;来自 vivo 互联网服务器团队- Pang Haiyun 介绍 Kafka Streams 的原理架构&#xff0c;常见配置以及在监控场景的应用。 一、背景 在当今大数据时代&#xff0c;实时数据处理变得越来越重要&#xff0c;而监控数据的实时性和可靠性是监控能力建设最重要的一环…...

【计算机视觉基础CV】03-深度学习图像分类实战:鲜花数据集加载与预处理详解

本文将深入介绍鲜花分类数据集的加载与处理方式&#xff0c;同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向&#xff0c;为读者提供从数据组织、预处理、加载到可视化展示的完整过程&#xff0c;并为后续模型训练打下基础。 前言 在计算机视觉的深…...

Android实现RecyclerView边缘渐变效果

Android实现RecyclerView边缘渐变效果 1.前言&#xff1a; 是指在RecyclerView中实现淡入淡出效果的边缘效果。通过这种效果&#xff0c;可以使RecyclerView的边缘在滚动时逐渐淡出或淡入&#xff0c;以提升用户体验。 2.Recyclerview属性&#xff1a; 2.1、requiresFading…...

springboot结合AES和国密SM4进行接口加密

api接口加密 1.为什么需要api接口加密呢&#xff1f; 1.防止爬虫 2.防止数据被串改 3.确保数据安全 2.如何实现接口加密呢&#xff1f; 3.我们可以使用哪些加密算法来加密呢&#xff1f; AES 密码学中的高级加密标准&#xff08;Advanced Encryption Standard&#xff0c;…...

后端项目java中字符串、集合、日期时间常用方法

我这里只介绍了项目中最常用的哈,比如像集合有很多,但我们最常用的就是ArrayList。 然后我这里会以javascript中的字符串、数组的方法为基准来实现,有些方法js和java会有些区别也会介绍 字符串 每次修改 String 对象都会创建一个新的对象,而 StringBuffer 可以在同一个对象…...

前端框架Vue的路由机制

大家好&#xff0c;我是G探险者。 最近在调试前端代码的时候&#xff0c;遇到一个问题。首先我们有一个门户页面&#xff0c;该页面里面有很多的豆腐块&#xff0c;每个豆腐块会配置一个系统的跳转连接。 我的系统就是其中一个豆腐块&#xff0c;我第一次登录进来之后&#xf…...

flutter 快速实现侧边栏

首先我们写一个侧边栏工具类&#xff0c;示例如下&#xff1a; import package:flutter/material.dart;class Sidebar extends StatelessWidget {overrideWidget build(BuildContext context) {return Drawer(child: ListView(padding: EdgeInsets.zero,children: <Widget&…...

华为数通最新题库 H12-821 HCIP稳定过人中

以下是成绩单和考试人员 HCIP H12-831 HCIP H12-725 安全中级...

算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II

93. 复原 IP 地址--分割 题目 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…...

JS,递归,处理树形数据组件,模糊查询树形结构数据字段

JS递归如何模糊查询树形结构数据,根据数据中的某一个字段值&#xff0c;模糊匹配 直接拿去使用就行 function filterTreeLabel(arr, label) {let result []arr.forEach((item) > {// if (String(item.POBJECT_NAME).toLowerCase().indexOf(label)!-1) {if (String(item.P…...