【算法与数据结构】718、1143、1035、392、115、LeetCode最长重复子数组+最长公共子序列+不相交的线+判断子序列+不同的子序列

文章目录

  • 一、718、最长重复子数组
  • 二、1143、最长公共子序列
  • 三、1035、不相交的线
  • 四、392、判断子序列
  • 五、115、不同的子序列
  • 六、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、718、最长重复子数组

在这里插入图片描述

  思路分析

  • 第一步,动态数组的含义。 d p [ i ] [ j ] dp[i][j] dp[i][j]代表以下标 i − 1 i - 1 i1为结尾的nums1,和以下标 j − 1 j - 1 j1为结尾的nums2,最长重复子数组长度为 d p [ i ] [ j ] dp[i][j] dp[i][j]
  • 第二步,递推公式。根据 d p [ i ] [ j ] dp[i][j] dp[i][j]的定义, d p [ i ] [ j ] dp[i][j] dp[i][j]的状态只能由 d p [ i − 1 ] [ j − 1 ] dp[i - 1][j - 1] dp[i1][j1]推导出来。
	if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
  • 第三步,元素初始化。dp数组中的所有元素都初始化为0。
  • 第四步,递归顺序。一共有两层循环,先遍历nums1或者先遍历nums2都可以。
  • 第五步,打印结果。题目要求长度最长的子数组的长度。所以在遍历的时候顺便把 d p [ i ] [ j ] dp[i][j] dp[i][j]的最大值记录下来。
      程序如下
// 718、最长重复子数组
class Solution {
public:
	int findLength(vector<int>& nums1, vector<int>& nums2) {
		vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= nums1.size(); i++) {
			for (int j = 1; j <= nums2.size(); j++) {
				if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm) n n n m m m分别是两个数组的长度。
  • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

二、1143、最长公共子序列

在这里插入图片描述

  思路分析

  1. 第一步,动态数组的含义。 d p [ i ] [ j ] dp[i][j] dp[i][j]代表以下标 i − 1 i - 1 i1为结尾的text1,和以下标 j − 1 j - 1 j1为结尾的text2,最长公共子序列长度为 d p [ i ] [ j ] dp[i][j] dp[i][j]
  2. 第二步,递推公式。 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由两种情况推导出来:
  • t e x t 1 [ i − 1 ] text1[i - 1] text1[i1] t e x t 2 [ j − 1 ] text2[j - 1] text2[j1]相同:那么找到一个公共元素, d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i - 1][j - 1] + 1 dp[i][j]=dp[i1][j1]+1
  • t e x t 1 [ i − 1 ] text1[i - 1] text1[i1] t e x t 2 [ j − 1 ] text2[j - 1] text2[j1]不相同:那么 t e x t 1 [ 0 , i − 2 ] text1[0, i - 2] text1[0,i2] t e x t 2 [ 0 , j − 1 ] text2[0, j - 1] text2[0,j1]的最长公共子序列和 t e x t 1 [ 0 , i − 1 ] text1[0, i - 1] text1[0,i1] t e x t 2 [ 0 , j − 2 ] text2[0, j - 2] text2[0,j2]的最长公共子序列,取最大的。
	if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
	else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
  1. 第三步,元素初始化。dp数组中的所有元素都初始化为0。
  2. 第四步,递归顺序。一共有两层循环,从前往后进行遍历。
  3. 第五步,打印结果。题目要求最长公共子序列的长度。所以在遍历的时候顺便把 d p [ i ] [ j ] dp[i][j] dp[i][j]的最大值记录下来。
      程序如下
// 1143、最长公共子序列
class Solution2 {
public:
	int longestCommonSubsequence(string text1, string text2) {
		vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= text1.size(); i++) {
			for (int j = 1; j <= text2.size(); j++) {
				if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

				if(dp[i][j] > result) result = dp[i][j];
			}
		}
		return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm) n n n m m m分别是两个序列的长度。
  • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

三、1035、不相交的线

在这里插入图片描述
在这里插入图片描述

  思路分析:本题要求绘制的最大连线数,实际上就是求两个字符串的最长公共子序列的长度,即1143、最长公共子序列这道题。我们将字符串改成数组,代码完全一样,直接copy过来。
  程序如下

// 1035、不相交的线
class Solution3 {
public:
	int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
		vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= nums1.size(); i++) {
			for (int j = 1; j <= nums2.size(); j++) {
				if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm) n n n m m m分别是两个数组的长度。
  • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

四、392、判断子序列

在这里插入图片描述

  思路分析:本题的思路和1143、最长公共子序列的分析思路差不多,主要区别在于本题判断的是“ 最长公共子序列是不是另一个字符串的子串”。那么我们找到二者的最长公共子串,判断其长度是否等于s的长度即可。

  1. 第一步,动态数组的含义。 d p [ i ] [ j ] dp[i][j] dp[i][j]代表以下标 i − 1 i - 1 i1为结尾的s,和以下标 j − 1 j - 1 j1为结尾的t,最长公共子序列长度为 d p [ i ] [ j ] dp[i][j] dp[i][j]
  2. 第二步,递推公式。 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由两种情况推导出来:
  • s [ i − 1 ] s[i - 1] s[i1] t [ j − 1 ] t[j - 1] t[j1]相同:那么找到一个公共元素, d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i - 1][j - 1] + 1 dp[i][j]=dp[i1][j1]+1
  • s [ i − 1 ] s[i - 1] s[i1] t [ j − 1 ] t[j - 1] t[j1]不相同:那么 d p [ i ] [ j ] dp[i][j] dp[i][j]等于 s [ 0 , i − 1 ] s[0, i - 1] s[0,i1] t [ 0 , j − 2 ] t[0, j - 2] t[0,j2]的最长公共子序列。
	if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
	else dp[i][j] = dp[i][j - 1];		// 与1143不同的地方
  1. 第三步,元素初始化。dp数组中的所有元素都初始化为0。
  2. 第四步,递归顺序。一共有两层循环,从前往后进行遍历。
  3. 第五步,打印结果。题目要求最长公共子序列的长度。所以在遍历的时候顺便把 d p [ i ] [ j ] dp[i][j] dp[i][j]的最大值记录下来,在用三目运算符返回。
	return result == s.size() ? true : false;	// 与1143不同的地方

  程序如下

// 392、判断子序列-动态规划
class Solution4 {
public:
	bool isSubsequence(string s, string t) {
		vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= s.size(); i++) {
			for (int j = 1; j <= t.size(); j++) {
				if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = dp[i][j - 1];		// 与1143不同的地方

				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result == s.size() ? true : false;	// 与1143不同的地方
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm) n n n m m m分别是两个字符串的长度。
  • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

五、115、不同的子序列

在这里插入图片描述

  思路分析:本题的思路和1143、最长公共子序列的分析思路差不多。本题统计字符串t在字符串s中出现的次数,我们可以理解为删除掉字符串s中的部分字符使得字符串s和字符串t相同的方法数量。

  1. 第一步,动态数组的含义。 d p [ i ] [ j ] dp[i][j] dp[i][j]代表以下标 j − 1 j - 1 j1为结尾的t在以下标 i − 1 i - 1 i1为结尾的s中出现的次数为 d p [ i ] [ j ] dp[i][j] dp[i][j],即 t [ 0 , j − 1 ] t[0, j-1] t[0,j1] s [ 0 , i − 1 ] s[0, i-1] s[0,i1]中出现的次数。

  2. 第二步,递推公式。 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由两种情况推导出来:

  • s [ i − 1 ] s[i - 1] s[i1] t [ j − 1 ] t[j - 1] t[j1]相同:此时的 d p [ i ] [ j ] dp[i][j] dp[i][j]由两部分组成。一部分是用 s [ i − 1 ] s[i-1] s[i1]来匹配:相当于在 s [ 0 , i − 2 ] s[0, i-2] s[0,i2]中寻找 t [ 0 , j − 2 ] t[0, j-2] t[0,j2]的个数(剩下一个字符 s [ i − 1 ] s[i - 1] s[i1] t [ j − 1 ] t[j - 1] t[j1]已经匹配了),即 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1];另一部分是不用 s [ i − 1 ] s[i-1] s[i1]来匹配,相当于在 s [ 0 , i − 2 ] s[0, i-2] s[0,i2]中寻找 t [ 0 , j − 1 ] t[0, j-1] t[0,j1]的个数,即 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j]
  • s [ i − 1 ] s[i - 1] s[i1] t [ j − 1 ] t[j - 1] t[j1]不相同:那么 s [ 0 , i − 2 ] s[0, i - 2] s[0,i2]中, t [ 0 , j − 1 ] t[0, j - 1] t[0,j1]的数量和 s [ 0 , i − 1 ] s[0, i - 1] s[0,i1]中, t [ 0 , j − 1 ] t[0, j - 1] t[0,j1]的数量相同。 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j]
	if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];	
	else dp[i][j] = dp[i - 1][j];

  例子:s=“bageg”,t=“bag”。那么用s[4]="g"组成bag的方法数量,相当于在s[0, 3]="bage"中寻找中t[0, 1]="ba"的个数,只有s[0]s[1]s[4]这一种。而不用s[4]="g"组成bag的方法数量,相当于在s[0,3] ="bage"中,寻找t[0,2]="bag"的个数,即dp[4, 3],只有s[0]s[1]s[2]这一种。(说明:dp[4,2]=1代表在s[0,3] ="bage"中,t[0,1]="ba"的个数为1。)

在这里插入图片描述

  1. 第三步,元素初始化。 d p [ i ] [ 0 ] dp[i][0] dp[i][0](第一列)表示字符串 s [ 0 , i − 1 ] s[0, i-1] s[0,i1]中可以随便删除元素,出现空字符串的个数。 d p [ 0 ] [ j ] dp[0][j] dp[0][j](第一行)表示空字符串 s s s,出现字符串 t [ 0 , j − 1 ] t[0, j-1] t[0,j1]的个数。其中,空字符串s中空字符串t的个数为1。那么 d p [ 0 ] [ 0 ] = 1 , d p [ i ] [ 0 ] = 1 , d p [ 0 ] [ j ] = 0 dp[0][0]=1, dp[i][0] = 1, dp[0][j] = 0 dp[0][0]=1,dp[i][0]=1,dp[0][j]=0
  2. 第四步,递归顺序。一共有两层循环,从前往后进行遍历。
  3. 第五步,打印结果。
      程序如下
// 115、不同的子序列-动态规划
class Solution5 {
public:
	int numDistinct(string s, string t) {
		vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0));
		for (int i = 0; i <= s.size(); i++) dp[i][0] = 1;		// 第一列初始化为1, dp[0][0]为1
		for (int j = 1; j <= t.size(); j++) dp[0][j] = 0;		// 第一行初始化为0, 可以省略
		for (int i = 1; i <= s.size(); i++) {
			for (int j = 1; j <= t.size(); j++) {
				if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];	
				else dp[i][j] = dp[i - 1][j];
			}
		}
		return dp[s.size()][t.size()];
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm) n n n m m m分别是两个字符串的长度。
  • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

六、完整代码

# include <iostream>
# include <vector>
# include <string>
using namespace std;

// 718、最长重复子数组
class Solution {
public:
	int findLength(vector<int>& nums1, vector<int>& nums2) {
		vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= nums1.size(); i++) {
			for (int j = 1; j <= nums2.size(); j++) {
				if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result;
	}
};

// 1143、最长公共子序列
class Solution2 {
public:
	int longestCommonSubsequence(string text1, string text2) {
		vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= text1.size(); i++) {
			for (int j = 1; j <= text2.size(); j++) {
				if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result;
	}
};

// 1035、不相交的线-动态规划
class Solution3 {
public:
	int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
		vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= nums1.size(); i++) {
			for (int j = 1; j <= nums2.size(); j++) {
				if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result;
	}
};

// 392、判断子序列-动态规划
class Solution4 {
public:
	bool isSubsequence(string s, string t) {
		vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));
		int result = 0;
		for (int i = 1; i <= s.size(); i++) {
			for (int j = 1; j <= t.size(); j++) {
				if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = dp[i][j - 1];		// 与1143不同的地方

				if (dp[i][j] > result) result = dp[i][j];
			}
		}
		return result == s.size() ? true : false;	// 与1143不同的地方
	}
};

// 115、不同的子序列-动态规划
class Solution5 {
public:
	int numDistinct(string s, string t) {
		vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0));
		for (int i = 0; i <= s.size(); i++) dp[i][0] = 1;		// 第一列初始化为1, dp[0][0]为1
		for (int j = 1; j <= t.size(); j++) dp[0][j] = 0;		// 第一行初始化为0, 可以省略
		for (int i = 1; i <= s.size(); i++) {
			for (int j = 1; j <= t.size(); j++) {
				if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];	
				else dp[i][j] = dp[i - 1][j];
			}
		}
		return dp[s.size()][t.size()];
	}
};

int main() {
	//vector<int> nums1 = { 1, 2, 3, 2, 1 }, nums2 = { 3, 2, 1, 4, 7 };		// 测试案例
	//Solution s1;
	//int result = s1.findLength(nums1, nums2);

	//string text1 = "abcde", text2 = "ace";		// 测试案例
	//Solution2 s1;
	//int result = s1.longestCommonSubsequence(text1, text2);

	//vector<int> nums1 = { 1, 4, 2 }, nums2 = { 1, 2, 4 };		// 测试案例
	//Solution3 s1;
	//int result = s1.maxUncrossedLines(nums1, nums2);

	//string s = "abc", t = "ahbgdc";			// 测试案例
	//Solution4 s1;
	//int result = s1.isSubsequence(s, t);

	string s = "babgbag", t = "bag";		// 测试案例
	Solution5 s1;
	int result = s1.numDistinct(s, t);

	cout << result << endl;
	system("pause");
	return 0;
}

end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电阻一文搞懂!

1.品牌 厚声、风华&#xff0c;三星、罗姆、松下、KOA 2.分类 插件 碳膜电阻&#xff1a;精度-5 J 是在高阻&#xff0c;高压和高温应用中 属负温度系数电阻 金属膜&#xff1a;-1 F 薄膜电阻和厚膜电阻的区别&#xff1a;薄膜电阻和厚膜电阻区别&#xff0c;了解即可…

元数据驱动的思想

元数据驱动的思想 元数据驱动的思想应该不会陌生&#xff0c;但元数据驱动的实践应该会非常陌生。 因为元数据驱动架构是为了解决高频个性化的复杂业务而诞生的&#xff0c;而这种业务场景只存在2B领域。 有关元数据驱动的架构思想&#xff0c;在这里暂先简单抛几个点。&#…

SpringBoot接入微信公众号【服务号】

SpringBoot接入微信公众号【服务号】 一、服务号注册 注册地址&#xff1a;https://mp.weixin.qq.com/cgi-bin/registermidpage?actionindex&langzh_CN 注册流程参考&#xff1a;https://kf.qq.com/touch/faq/150804UVr222150804quq6B7.html?platform15 二、服务号配…

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为&#xff0c;匹配的正则表达式"^.{8,}$"…

51单片机之LED灯模块篇

御风以翔 破浪以飏 &#x1f3a5;个人主页 &#x1f525;个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…

在Android实现光影移动效果【流光效果】

说明 本文是在Android实现光影移动效果【流光效果】 效果如下 图1 ShimmerView 图2 ShimmerTextView ShimmerView.kt import android.animation.ValueAnimator import android.content.Context import android.graphics.Canvas import android.graphics.Color import android…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料&#xff1a; TensorRT 源码示例 B站视频&#xff1a;TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码&#xff1a;cookbook → 07-Tool → trtexec 官方文档&#xff1a;trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…

PHP安装后错误处理

一&#xff1a;问题 安装PHP后提示错误如下 二&#xff1a;解决 1&#xff1a;Warning: Module mysqli already loaded in Unknown on line 0解决 原因&#xff1a;通过php.ini配置文件开启mysqli扩展的时候&#xff0c;开启了多次 解决&#xff1a;将php.ini配置文件中多个…

如何计算JMeter性能和稳定性测试中的TPS?

1、普通计算公式 TPS 总请求数 / 总时间 按照需求得到基础数据&#xff0c;比如在去年第xxx周&#xff0c;某平台有5万的浏览量那么总请求数我们可以估算为5万&#xff08;1次浏览都至少对应1个请求&#xff09; 总请求数 50000请求数 总时间&#xff1a;由于不知道每个请…

DBeaver添加阿里maven镜像

1、点击数据库->驱动管理器 2、选择任意数据库&#xff0c;点击编辑按钮 3、点击下载/更新(D) 4、点击下载配置 5、点击添加 6、添加阿里云地址 http://maven.aliyun.com/nexus/content/groups/public/ 7、将阿里云地址移动到首位并点击"应用并关闭"

【漏洞复现】大华智慧园区综合管理平台bitmap接口存在任意文件上传漏洞

漏洞描述 大华智慧园区综合管理平台是一款综合管理平台,具备园区运营、资源调配和智能服务等功能。平台意在协助优化园区资源分配,满足多元化的管理需求,同时通过提供智能服务,增强使用体验。大华智慧园区综合管理平台bitmap接口存在任意文件上传漏洞,但未在上传的文件类…

路由聚合问题和子网划分问题范例

看到网上有人询问下面的问题&#xff1a; 前者是路由聚合的问题&#xff0c;后者是子网划分计算的问题。解答过程如下&#xff1a; 第五题&#xff0c;路由聚合答案是B 路由聚合可以减少路由条目&#xff0c;提高效率&#xff0c;一般都要通过减小掩码值来完成。 首先&am…

MATLAB实现高通滤波(附完整代码)

1.MATLAB实现高通滤波器 以下是一个使用MATLAB实现高通滤波器的例子。在这个例子中&#xff0c;我们将设计一个简单的数字高通滤波器&#xff0c;然后将其应用到一个包含低频和高频成分的信号上。 clc;close all;clear all;warning off;%清除变量 rand(seed, 500); randn(s…

ANTLR4规则解析生成器(一):入门

文章目录 1 什么是ANTLR42 为什么需要ANTLR43 环境搭建4 官方示例4.1 编写语法规则文件4.2 生成语法解析器4.3 基于SDK实现逻辑 5 总结 1 什么是ANTLR4 ANTLR是ANother Tool for Language Recognition的缩写&#xff0c;它是一个强大的用于读取、处理、执行和翻译结构化文本或…

你了解引用和指针的区别吗?

前言&#xff1a; 在计算机编程中&#xff0c;引用和指针是两个重要的概念&#xff0c;它们用于处理内存中的数据。它们在很多编程语言中都有相应的支持&#xff0c;例如C和C。对于c语言来说&#xff0c;指针是最重要的概念之一&#xff0c;想要学好c语言就难以绕开对于指针的学…

想上岸?有这个神器足矣!

之前说的给大家一个大惊喜&#xff01;今天终于迎来了见证时刻&#xff01; 我们的官网上线啦&#xff01;&#xff01;&#xff01; 截止目前我已经做了200套名校真题&#xff0c;100所择校分析&#xff0c;150篇分院校重点勾画&#xff0c;以及非常非常多的文章&#xff0c…

简单的JavaScript去下载转换为Base64的PDF文件

新建一个文件&#xff0c;内容填写如下&#xff0c;然后保存为 .html 类型的文件 再用浏览器打开&#xff0c;就会是下面这样子&#xff1a; 图一红色textarea里面&#xff0c;可以将PDF文件转换成BASE64位后的内容贴进去&#xff0c;点击下载时&#xff0c;就可以直接下载成PD…

Matlab数字图像处理——图像复原与滤波算法应用方法

图像处理领域一直以来都是计算机科学和工程学的一个重要方向&#xff0c;图像复原则是其中一个重要的研究方向之一。图像复原旨在通过运用各种滤波算法&#xff0c;对图像进行去噪、恢复和改善&#xff0c;以提高图像的质量和可视化效果。在本文中&#xff0c;我们将介绍如下内…

WordPress主题YIA如何将首页的置顶小工具改为站长推荐小工具?

YIA主题有“置顶推荐”小工具&#xff0c;首页文章列表页有置顶功能&#xff0c;可在YIA主题设置 >> 列表 >> 首页-最新发布 >> 显示置顶文章中开启或关闭。如果将“置顶推荐”小工具添加到“首页顶栏”&#xff0c;同时也开启首页最新发布的“显示置顶文章”…

kernel32.dll文件缺失要如何解决?科学分享kernel32.dll文件

面对 kernel32.dll 文件丢失的问题&#xff0c;别担心&#xff01;这篇文章将为您提供多种有效的解决策略&#xff0c;不论您是电脑专家还是刚入门的新手&#xff0c;我们的指南都能帮到您。详细的步骤和每种方法的具体注意点都在这里&#xff0c;按照指南操作&#xff0c;您将…