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

【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

目录

  • 题目描述
  • 思路及实现
    • 方式一:动态规划法
      • 思路
      • 代码实现
        • Java版本
        • C语言版本
        • Python3版本
      • 复杂度分析
    • 方式二:中心扩展法
      • 思路
      • 代码实现
        • Java版本
        • C语言版本
        • Python3版本
      • 复杂度分析
  • 总结
  • 相似题目

  • 标签(题目类型):回文串、动态规划

题目描述

给定一个字符串 `s`,找到其中最长的回文子串。可以假设 `s` 的最大长度为 1000。示例1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。示例2:
输入: "cbbd"
输出: "bb"

原题:LeetCode 5

思路及实现

方式一:动态规划法

思路

Dynamic Programming(DP) 动态规划是一种将问题分解成子问题并分别计算的优化技术。对于回文子串,我们可以使用动态规划来解决。

对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。

通过定义一个二维数组 dp[i][j],表示 s 的第 i 个字符到第 j 个字符组成的子串是否为回文字符串。当 i == j 时,表示一个字符,是回文字符串,当 i + 1 == j ,则优先考虑两个字符是否相等来将问题规模缩小,同时考虑前一个子串是否为回文字符串。对于 i + 1 < j 的情况,可以通过判断 s[i] 和 s[j] 是否相等,并判断定义的 dp[i+1][j-1] 是否为回文字符串。如果是回文字符串,则 dp[i][j] 也是回文字符串。

代码实现

Java版本
class Solution {public String longestPalindrome(String s) {int n = s.length(); // 计算字符串的长度boolean[][] dp = new boolean[n][n]; // 创建一个二维数组用于记录子串是否为回文串String ans = ""; // 初始化最长回文子串为空字符串// 遍历所有长度的子串for (int len = 1; len <= n; len++) {// 遍历子串的起始位置for (int i = 0; i + len - 1 < n; i++) {int j = i + len - 1; // 子串的结束位置if (len == 1) {dp[i][j] = true; // 单个字符必定是回文串} else if (len == 2) {dp[i][j] = (s.charAt(i) == s.charAt(j)); // 只有两个字符时判断是否相等} else {dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]); // 多于两个字符时判断首尾字符是否相等}if (dp[i][j] && len > ans.length()) { // 如果当前子串是回文串并且长度更长ans = s.substring(i, j + 1); // 更新结果为当前子串}}}return ans;}
}

说明:
longestPalindrome 方法用于寻找给定字符串中的最长回文子串。使用动态规划的思想,创建一个二维数组 dp,其中 dp[i][j] 表示从索引 i 到索引 j 的子串是否为回文串。
通过遍历所有长度的子串,以及遍历子串的起始位置,判断子串是否为回文串,并根据回文串的长度更新最长回文子串 ans。
当子串的长度为 1 时,即一个字符,必定是回文串。
当子串的长度为 2 时,判断首尾两个字符是否相等。
当子串的长度大于 2 时,判断首尾两个字符是否相等,并根据 dp[i+1][j-1] 的结果判断子串是否为回文串。
如果当前子串是回文串,并且长度比之前记录的最长回文子串长度更长,则更新最长回文子串 ans。
最后,返回最长回文子串。

C语言版本

char* longestPalindrome(char* s) {int n = strlen(s); // 计算字符串的长度bool dp[n][n]; // 创建一个二维数组用于记录子串是否为回文串memset(dp, false, sizeof(dp)); // 初始化dp数组为falsechar* ans = ""; // 初始化最长回文子串为空字符串// 遍历所有长度的子串for (int len = 1; len <= n; len++) {// 遍历子串的起始位置for (int i = 0; i + len - 1 < n; i++) {int j = i + len - 1; // 子串的结束位置if (len == 1) {dp[i][j] = true; // 单个字符必定是回文串} else if (len == 2) {dp[i][j] = (s[i] == s[j]); // 只有两个字符时判断是否相等} else {dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]); // 多于两个字符时判断首尾字符是否相等}if (dp[i][j] && len > strlen(ans)) { // 如果当前子串是回文串并且长度更长char* sub = (char*)malloc((len + 1) * sizeof(char)); // 分配内存保存当前子串strncpy(sub, s + i, len); // 复制当前子串到内存中sub[len] = '\0'; // 添加字符串结束标志ans = sub; // 更新结果为当前子串}}}return ans;
}

说明: (同上)
longestPalindrome 函数用于寻找给定字符串中的最长回文子串。使用动态规划的思想,创建一个二维数组 dp,用于记录子串是否为回文串。
通过遍历所有长度的子串,以及遍历子串的起始位置,判断子串是否为回文串,并根据回文串的长度更新最长回文子串 ans。
子串的判断分三种情况:
当子串的长度为 1 时,即一个字符,必定是回文串。
当子串的长度为 2 时,判断首尾两个字符是否相等。
当子串的长度大于 2 时,判断首尾两个字符是否相等,并根据 dp[i+1][j-1] 的结果判断子串是否为回文串。
如果当前子串是回文串,并且长度比之前记录的最长回文子串长度更长,则更新最长回文子串 ans。
最后,返回最长回文子串。

Python3版本
class Solution:def longestPalindrome(self, s: str) -> str:n = len(s)dp = [[False] * n for _ in range(n)]ans = ""# 遍历所有长度的子串for length in range(1, n + 1):# 遍历子串的起始位置for i in range(n - length + 1):j = i + length - 1  # 子串的结束位置if length == 1:dp[i][j] = True  # 单个字符必定是回文串elif length == 2:dp[i][j] = (s[i] == s[j])  # 只有两个字符时判断是否相等else:dp[i][j] = (s[i] == s[j] and dp[i + 1][j - 1])  # 多于两个字符时判断首尾字符是否相等if dp[i][j] and length > len(ans):  # 如果当前子串是回文串并且长度更长ans = s[i:j + 1]  # 更新结果为当前子串return ans

说明: (同上)
longestPalindrome 方法用于寻找给定字符串中的最长回文子串。使用动态规划的思想,创建一个二维数组dp,其中dp[i][j]表示从索引i到索引j的子串是否为回文串。通过遍历所有长度的子串,从最短的子串起,依次判断是否为回文串,并根据判断结果更新最长回文子串。最后,返回最长回文子串。
dp[i][j]的判断依据如下:
当子串长度为1时,dp[i][j]为True,因为单个字符必定是回文串;
当子串长度为2时,子串为回文串的条件是s[i]和s[j]相等;
当子串长度大于2时,子串为回文串的条件是首尾字符相等且去除首尾字符的子串也为回文串。
当发现一个更长的回文子串时,将其更新为结果。

复杂度分析

  • 时间复杂度:该算法的时间复杂度为 O(n^2),其中 n 是字符串的长度。双重循环遍历了所有长度为 1 到 n 的子串。
  • 空间复杂度:该算法的空间复杂度为 O(n^2),存储了一个二维数组 dp。

方式二:中心扩展法

思路

中心扩展法的基本思路是从左至右遍历字符串,以当前字符和其相邻字符为中心,向两边扩展,判断是否为回文串。在判断时,可以将回文串的起始和结束位置保存下来。

从每一个位置出发,向两边扩散即可。遇到不是回文的时候结束。举个例子,str=acdbbdaa 我们需要寻找从第一个 b(位置为 3)出发最长回文串为多少。怎么寻找?
首先往左寻找与当期位置相同的字符,直到遇到不相等为止。
然后往右寻找与当期位置相同的字符,直到遇到不相等为止。
最后左右双向扩散,直到左和右不相等。如下图所示:
在这里插入图片描述
每个位置向两边扩散都会出现一个窗口大小(len)。如果 len>maxLen(用来表示最长回文串的长度)。则更新 maxLen 的值。
因为我们最后要返回的是具体子串,而不是长度,因此,还需要记录一下 maxLen 时的起始位置(maxStart),即此时还要 maxStart=len。

代码实现

Java版本
class Solution {public String longestPalindrome(String s) {int start = 0; // 回文串的起始位置int end = 0; // 回文串的结束位置for (int i = 0; i < s.length(); i++) {int len1 = expandAroundCenter(s, i, i); // 以当前字符为中心的回文串长度int len2 = expandAroundCenter(s, i, i + 1); // 以当前字符和下一个字符为中心的回文串长度int len = Math.max(len1, len2); // 取较长的回文串长度if (len > end - start) {start = i - (len - 1) / 2; // 更新回文串的起始位置end = i + len / 2; // 更新回文串的结束位置}}return s.substring(start, end + 1); // 根据起始位置和结束位置返回最长回文子串}private int expandAroundCenter(String s, int left, int right) {while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--; // 向左扩展right++; // 向右扩展}return right - left - 1; // 返回回文串的长度}
}

说明:
longestPalindrome 方法用于寻找给定字符串中的最长回文子串。根据中心扩展法的思想,遍历字符串中的每个字符,以当前字符为中心向两边扩展,同时以当前字符和下一个字符为中心向两边扩展,获取回文串的长度。通过比较回文串的长度,不断更新最长回文串的起始位置和结束位置。最后,根据起始位置和结束位置从原字符串中截取出最长回文子串并返回。
expandAroundCenter 方法用于以指定的左右位置为中心向两边扩展,判断是否为回文串。通过比较左右位置的字符是否相等,并同时向左和向右移动位置来不断扩展回文串的长度。最后,返回回文串的长度。

C语言版本
char* longestPalindrome(char* s) {int len = strlen(s);int start = 0;int end = 0;for (int i = 0; i < len; i++) {int len1 = expandAroundCenter(s, i, i);int len2 = expandAroundCenter(s, i, i + 1);int len = len1 > len2 ? len1 : len2;if (len > end - start) {start = i - (len - 1) / 2; // 更新回文串起始位置end = i + len / 2; // 更新回文串结束位置}}char *longest_palindrome = malloc((end - start + 2) * sizeof(char));strncpy(longest_palindrome, s + start, end - start + 1); // 复制回文串至新分配的内存longest_palindrome[end - start + 1] = '\0';return longest_palindrome;
}int expandAroundCenter(char *s, int left, int right) {while (left >= 0 && right < strlen(s) && s[left] == s[right]) {left--; // 向左扩展right++; // 向右扩展}return right - left - 1; // 返回回文串的长度
}

说明:
longestPalindrome 函数用于寻找给定字符串中的最长回文子串。通过遍历字符串并以每个字符为中心依次判断以该字符或相邻两个字符为中心的回文串长度。通过比较回文串的长度,不断更新最长回文串的起始位置和结束位置。最后,将最长回文串从原字符串复制到新分配的内存中并返回。
expandAroundCenter 函数用于在给定字符串中以指定的左右位置为中心向两边扩展,判断是否为回文串。通过比较左右位置的字符是否相等,并同时向左和向右移动位置来不断扩展回文串的长度。最后,返回回文串的长度。

Python3版本
class Solution:def longestPalindrome(self, s: str) -> str:start = 0end = 0for i in range(len(s)):len1 = self.expandAroundCenter(s, i, i)len2 = self.expandAroundCenter(s, i, i + 1)length = max(len1, len2)if length > end - start:start = i - (length - 1) // 2 # 更新回文串起始位置end = i + length // 2 # 更新回文串结束位置return s[start: end + 1] # 根据起始位置和结束位置返回最长回文子串def expandAroundCenter(self, s: str, left: int, right: int) -> int:while left >= 0 and right < len(s) and s[left] == s[right]:left -= 1 # 向左扩展right += 1 # 向右扩展return right - left - 1 # 返回回文串的长度
}

说明:
longestPalindrome 函数用于寻找给定字符串中的最长回文子串。通过遍历字符串并以每个字符为中心或相邻两个字符为中心依次判断以该中心为起点的回文串长度。通过比较回文串的长度,不断更新最长回文串的起始位置和结束位置。最后,根据起始位置和结束位置从原字符串中截取出最长回文子串并返回。
expandAroundCenter 函数用于在给定字符串中以指定的左右位置为中心向两边扩展,判断是否为回文串。通过比较左右位置的字符是否相等,并同时向左和向右移动位置来不断扩展回文串的长度。最后,返回回文串的长度。

复杂度分析

  • 时间复杂度:该算法的时间复杂度为 O(n^2),其中 n 是字符串的长度。在中心扩展法中,每个字符仅遍历一次。
  • 空间复杂度:该算法的空间复杂度为 O(1),只使用了常量级的额外空间。

总结

方式备注优点缺点时间复杂度空间复杂度
动态规划法通过动态规划计算回文子串算法稳定可靠需要额外的二维数组存储状态O(n^2)O(n^2)
中心扩展法通过扩展中心位置计算回文子串具有较高效率对空间的使用较低O(n^2)O(1)

相似题目

(表格形式,列举出)

相似题目难度链接
两个数组的交集简单leetcode-349

相关文章:

【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

目录 题目描述思路及实现方式一&#xff1a;动态规划法思路代码实现Java版本C语言版本Python3版本 复杂度分析 方式二&#xff1a;中心扩展法思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相似题目 标签(题目类型)&#xff1a;回文串、动态规划 题目描述 给定一…...

39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml

39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml parseString 方法Python 解析XML实例使用xml.dom解析xml parseString 方法 parseString 方法是 Python 标准库中 xml.dom.minidom 模块中的一个函数&#xff0c;用于解析 XML 字符串并构建 DO…...

【蓝桥杯第九场小白赛】(部分)

最近写的零零散散的&#xff0c;感觉这两天遇到的题对于短时间提升意义已经不大了&#xff0c;还是做简单题保持手感吧哎 盖印章 #include <iostream> using namespace std; using LLlong long; int main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);LL n,m…...

【Linux】Supervisor 基础

要在Linux上启动Supervisor&#xff0c;你可以按照以下步骤进行操作&#xff1a; 确保你已经安装了Supervisor。使用适合你的Linux发行版的包管理器进行安装。例如&#xff0c;对于Ubuntu&#xff0c;可以运行以下命令安装Supervisor&#xff1a; sudo apt-get update sudo apt…...

48 全连接卷积神经网络 FCN【动手学深度学习v2】

全连接卷积神经网络&#xff1a;神经网络处理语义分割问题的奠基性工作&#xff0c;目前已不太常用。 了解一下全卷积网络模型最基本的设计。 如 下图所示&#xff0c;全卷积网络先使用卷积神经网络抽取图像特征&#xff0c;然后通过11卷积层将通道数变换为类别个数&#xff0…...

pytorch中的nn.MSELoss()均方误差损失函数

一、nn.MSELoss()是PyTorch中的一个损失函数&#xff0c;用于计算均方误差损失。 均方误差损失函数通常用于回归问题中&#xff0c;它的作用是计算目标值和模型预测值之间的平方差的平均值。 具体来说&#xff0c;nn.MSELoss()函数的输入是两个张量&#xff0c;即模型的真实值…...

三国游戏(贪心 排序)

三国游戏 利用贪心、排序、前缀和的计算方法&#xff0c;特别注意不要数据溢出了&#xff0c;sum 加long long s[i] x[i]-y[i]-z[i]输入: 3 1 2 2 2 3 2 1 0 7输出: 2#include <bits/stdc.h> using namespace std;const int N 1e5100;typedef long long ll;bool cm…...

GPU环境安装与虚拟环境安装(适用于Windows下的李沐GPU)

之前我是用的都是VMware的虚拟机且安装的是cpu的pytorch版本,因为想要使用GPU,最终实现了在Windows上使用GPU,并且相关原理也在参考文章或视频内,可以通过原理自行挑选自己所需的配置并安装。 文章目录 1.GPU安装1.1 名词解释1.2 卸载旧版本的CUDA1.3 版本选择步骤(Nivida显卡…...

Http Download

Http / Https 下载文件&#xff0c;startWith不能验证https&#xff0c;测试地址&#xff1a;https://storage.googleapis.com/golang/go1.7.3.windows-amd64.msi private static final Logger logger Logger.getLogger(MethodHandles.lookup().lookupClass());private static…...

【Android】Glide加载SVG,SVG转PNG

Dependency plugins {id kotlin-kapt }dependencies {api com.github.bumptech.glide:glide:4.12.0kapt com.github.bumptech.glide:compiler:4.12.0api com.caverock:androidsvg:1.4 }SvgDecoder 负责解码SVG资源 import com.bumptech.glide.load.Options import com.bumpte…...

Spring、SpringMVC、Springboot三者的区别和联系

1.背景 最近有人问面试的一个问题&#xff1a;Spring、SpringMVC、Springboot三者的区别和联系&#xff0c;个人觉得&#xff1a;万变不离其宗&#xff0c;只需要理解其原理&#xff0c;回答问题信手拈来。 2.三者区别和联系 2.1 先了解Spring基础 Spring 框架就像一个家族…...

一点点安全资料:网络安全扩展

协议扩展 加密协议SSL/TLS 简介 SSL&#xff08;Secure Sockets Layer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;是加密协议&#xff0c;设计用来提供网络通信的安全性和数据完整性。尽管TLS是SSL的后继者&#xff0c;但两者的核心目标相同&#x…...

vscode的源码插件GitHub Repositories

打铁还需自身硬&#xff0c;需要不断提升自我&#xff0c;提升自我的一种方式就是看源码&#xff0c;站在更高的维度去理解底层原理&#xff0c;以便以后更好的开发和解决问题&#xff0c;由于源码一个动不动就是几个G甚至十几个G&#xff0c;如果一个个源码下载下来&#xff0…...

如何定义快速开发平台框架?有何突出优势?

作为提质增效的利器软件&#xff0c;快速开发平台框架如何能在众多同行中取胜&#xff1f;又是凭借什么优势特点在激烈的市场竞争中获得众多客户的青睐与信任&#xff1f;不管是从企业角度、服务商角度&#xff0c;还是使用者的角度来说&#xff0c;做好流程化进程&#xff0c;…...

二分练习题——奶牛晒衣服

奶牛晒衣服 题目分析 这里出现了“弄干所有衣服的最小时间”&#xff0c;那么可以考虑用二分去做。 第一阶段二段性分析 假设当前需要耗费的时间为mid分钟&#xff0c;如果mid分钟内可以烘干这些衣服&#xff0c;那么我们可以确定右边界大于mid的区间一定也可以。但是此时我…...

python工具包【1】 -- 不同操作系统路径转换

python工具包【1】 – 不同操作系统路径转换 以下的工具类的作用是根据不同的操作系统&#xff0c;将代码中的路径转换成适应操作系统的路径。 代码 import osclass Base_Tools_Cls:def BasePathConvert_func(self, path):根据不同的操作系统&#xff0c;将路径进行转换为不…...

JAVA中@FunctionalInterface 注解使用

FunctionalInterface是Java 8引入的一个注解&#xff0c;用于标记一个接口为函数式接口。函数式接口是指只有一个抽象方法&#xff08;除了Object类中的默认方法如equals、hashCode等&#xff09;的接口。在Java 8及以后版本中&#xff0c;函数式接口可以与lambda表达式配合使用…...

【Spring Cloud Alibaba】9 - OpenFeign集成Sentinel实现服务降级

目录 一、简介Sentinel 是什么如何引入Sentinel 二、服务搭建1.安装Sentinel控制台1.1 下载1.2 启动1.3 访问 2.改造服务提供者cloud-provider服务2.1 引入依赖2.2 添加API2.3 添加配置文件 3.改造cloud-consumer-feign服务3.1 引入依赖3.2 添加Feign接口3.3 添加服务降级类3.4…...

Chrome浏览器如何跟踪新开标签的网络请求?

在测试一个东西的时候&#xff0c;它虽然是a链接&#xff0c;但是&#xff0c;是由前端在js里写跳转的。我又必须要知道它的跳转链接&#xff0c;只能用截屏的方式来捕捉浏览器的地址栏链接 打开浏览器控制台(F12)点击红色箭头打钩为弹出式窗口自动打开DevTools 英文版调试参…...

html写一个登录注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册登录界面Ⅰ</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.mi…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...