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

专题二十三_动态规划_回文串系列问题_算法专题详细总结

目录

动态规划

回文串系列问题

1. 回⽂⼦串(medium)

解析:

解决回文串问题,这里提供三个思路:

1.中心扩展法:n^2 / 1

2.马拉车算法:n / n

3.动态规划算法:n^2 / n^2

1.状态表达式:

2.状态转移方程:

3.初始化:

4.填表顺序:

5.返回值:

代码编写:

总结:

2. 最⻓回⽂⼦串(medium)

解析:

代码编写:

总结:

3. 回⽂串分割IV(hard)

解析:

代码编写:

总结:

4. 分割回⽂串II(hard)

代码编写:

总结:

5. 最⻓回⽂⼦序列(medium)

代码编写:

总结:

6. 让字符串成为回⽂串的最⼩插⼊次数(hard)

解析:

代码编写:

总结:

总结不易~本节对我有很大帮助和收获,希望对你也是~!!!


动态规划

经过前面几个专题的学习,特别是子数组系列、子序列问题等的动态规划,我相信到这里大家都有了质的飞跃,现在进入回文串系列问题,一定能有很多收获的~

回文串系列问题

1. 回⽂⼦串(medium)

题目意思还是很简单的,就是求出一个字符串内所有子串的回文串数目

解析:

解决回文串问题,这里提供三个思路:

1.中心扩展法:n^2 / 1
2.马拉车算法:n / n
3.动态规划算法:n^2 / n^2

这里的中心扩展法是最简单的一种算法,一般适用于简单的求解单个字符串是否是回文串的问题;其中马拉车算法是一种很复杂但是很优的算法,只能解决回文串这一种问题,而且学习成本很高,所以这里还是不推荐,如果你有强烈欲望,可以自己学习一下;再就是动态规划思想,是虽然这里的时间复杂度和空间复杂度都很高,但是我们学习的是这一种算法思想,通过动态规划的思想就能很轻松的将困难题变成简单题~

1.状态表达式:

由于一个字符串要有头尾两个字符才能判断当前的字符串是否是回文串:

所以要设置dp[i][j]表示:以i位置为开头,j位置为结尾的字符串是否是回文串

这样就可以将整个字符串的所有有两个字符位置表示的子串都在一个二维数组内表示出来;

2.状态转移方程:

只有在s[i] == s[j] 的时候才有讨论当前子串是否为回文串的意义,所以分三类讨论:

1.当i == j 时 两字符重叠,是回文串

2.当i+1 == j 时 s[i] == s[j] 并且两字符相邻,所以是回文串

3.当s[i] == s[j],但是两字符不相邻,所以就要缩小范围,来继续判断【i+1,j-1】这个范围内的字符串是否是回文串

3.初始化:

无需初始化,因为不会存在越界的问题,通过状态表达式,只需要判断当前位置dp[i][j]是否是满足回文串的问题

4.填表顺序:

由于dp内只存在这两种位置的访问情况,所以必须要先直到【i+1,j-1】才能知道【i,j】这个位置,所以填表顺序是从下往上,从左往右填表;即行数i倒着填,列数j正着填

5.返回值:

最后用ret统计dp内有多少个true即可

代码编写:

class Solution {
public:int countSubstrings(string s) {int n=s.size();vector<vector<int>> dp(n,vector<int>(n));int ret=0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){if(i==j||i+1==j) dp[i][j]=1;else if(i+1<n&&j-1>=0) dp[i][j]=dp[i+1][j-1];}if(dp[i][j]) ret++;}}return ret;}
};

总结:

由上面给出的求解回文串的三种方法中,动态规划思想是一种极为重要的思路,通过这题就可以看出动态规划思路很清晰明了,可以很简单的就将hard转换为easy

2. 最⻓回⽂⼦串(medium)

返回最长的一个回文子字符串

解析:

这一题的思路简直跟上一题一模一样,只是返回的内容不同,我们同样是要遍历所有的二维数组,就是遍历所有子串的情况,然后来判断当前位置是否满足回文串的条件,最后返回最长的即可:

 1.状态表达式:

由于一个字符串要有头尾两个字符才能判断当前的字符串是否是回文串:

所以要设置dp[i][j]表示:以i位置为开头,j位置为结尾的字符串是否是回文串

这样就可以将整个字符串的所有有两个字符位置表示的子串都在一个二维数组内表示出来;

2.状态转移方程:

只有在s[i] == s[j] 的时候才有讨论当前子串是否为回文串的意义,所以分三类讨论:

1.当i == j 时 两字符重叠,是回文串

2.当i+1 == j 时 s[i] == s[j] 并且两字符相邻,所以是回文串

3.当s[i] == s[j],但是两字符不相邻,所以就要缩小范围,来继续判断【i+1,j-1】这个范围内的字符串是否是回文串

3.初始化:

无需初始化,因为不会存在越界的问题,通过状态表达式,只需要判断当前位置dp[i][j]是否是满足回文串的问题

4.填表顺序:

由于dp内只存在这两种位置的访问情况,所以必须要先直到【i+1,j-1】才能知道【i,j】这个位置,所以填表顺序是从下往上,从左往右填表;即行数i倒着填,列数j正着填

5.返回值:

只需要返回最长的回文串即可,那么就要ret来记录最长的长度,_ret来记录当前最长的子字符串即可,返回_ret

代码编写:

class Solution {
public:string longestPalindrome(string s) {int n=s.size(),ret=0;vector<vector<int>> dp(n,vector<int>(n));string _ret;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){if(i==j||i+1==j) dp[i][j]=1;else if(i+1<n&&j-1>=0) dp[i][j]=dp[i+1][j-1];if(dp[i][j]&&j-i+1>ret){ret=j-i+1;_ret=s.substr(i,ret);}}}}return _ret;}
};

总结:

回文串系列的题目还是非常好想的,只要弄明白一题,后面就是照搬原样即可;

3. 回⽂串分割IV(hard)

将一个字符串分割成三块,如果这三块都是回文串,就直接返回true;否则返回false

解析:

这一题我们先要有一个整体的思路,肯定就是先要判断所有情况下的子字符串是否满足回文串,即设计二维数组来遍历所有下标,然后再来一个双重for将整个字符串分为3块,直接判断是否都是回文串并进行返回即可;

  1.状态表达式:

由于一个字符串要有头尾两个字符才能判断当前的字符串是否是回文串:

所以要设置dp[i][j]表示:以i位置为开头,j位置为结尾的字符串是否是回文串

这样就可以将整个字符串的所有有两个字符位置表示的子串都在一个二维数组内表示出来;

2.状态转移方程:

只有在s[i] == s[j] 的时候才有讨论当前子串是否为回文串的意义,所以分三类讨论:

1.当i == j 时 两字符重叠,是回文串

2.当i+1 == j 时 s[i] == s[j] 并且两字符相邻,所以是回文串

3.当s[i] == s[j],但是两字符不相邻,所以就要缩小范围,来继续判断【i+1,j-1】这个范围内的字符串是否是回文串

3.初始化:

无需初始化,因为不会存在越界的问题,通过状态表达式,只需要判断当前位置dp[i][j]是否是满足回文串的问题

4.填表顺序:

由于dp内只存在这两种位置的访问情况,所以必须要先直到【i+1,j-1】才能知道【i,j】这个位置,所以填表顺序是从下往上,从左往右填表;即行数i倒着填,列数j正着填

5.返回值:

要返回当前位置进行分割的三块字符串是否满足全是回文串,所以分割后的下标是暴力求解:

        for(int i=1;i<n-1;i++){for(int j=i;j<n-1;j++){if(dp[0][i-1]&&dp[i][j]&&dp[j+1][n-1]) return true;}}

代码编写:

class Solution {
public:bool checkPartitioning(string s) {int n=s.size();vector<vector<int>> dp(n,vector<int>(n));for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){// if(i==j||i+1==j) dp[i][j]=true;// else if(i+1<n&&j-1>=0) dp[i][j]=dp[i+1][j-1];dp[i][j]=i+1<j?dp[i+1][j-1]:true;}}}for(int i=1;i<n-1;i++){for(int j=i;j<n-1;j++){if(dp[0][i-1]&&dp[i][j]&&dp[j+1][n-1]) return true;}}return false;}
};

总结:

这一道hard题用动态规划的思路真的变的很简单,依旧是求出所有子串是否能成为回文串,然后再判断字符串分三块的问题直接暴力求解ok,所以这种思路一定要掌握,多复习也就记住了~

4. 分割回⽂串II(hard)

将一个字符串用最少的分割次数,让所有子串都是回文串,返回最少分割次数

解析:

1.状态表达式:

dp[i]表示:在s[0,i]位置上形成回文串的最少分割次数

2.状态转移方程:

dp[i] = min(dp[j - 1] + 1, dp[i]);

3.初始化:

由于dp表内是要求最小分割次数,每次都要取min,所以dp表内都初始化为INT_MAX

4.填表顺序:

从左往右填

5.返回值:

返回dp[n-1]

代码编写:

class Solution {
public:int minCut(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n));for (int i = n - 1; i >= 0; i--)for (int j = i; j < n; j++)if (s[i] == s[j])dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;vector<int> _dp(n, INT_MAX / 2);for (int i = 0; i < n; i++) {if (dp[0][i])_dp[i] = 0;else {for (int j = 1; j <= i; j++) {if (dp[j][i])_dp[i] = min(_dp[j - 1] + 1, _dp[i]);}}}return _dp[n - 1];}
};

总结:

这一题主要就是要想清楚怎么定义状态表达式,要明白了状态表达式的定义,说明出以i位置为结尾的最大分割次数,从而引出[0,i]是否是一整个回文,是就是0次;不是,就在进行判断,[1,j](0<j<=i) 判断当dp[j][i]这个位置是否为回文,是才能继续判断_dp[j-1]前面的最少分割次数

5. 最⻓回⽂⼦序列(medium)

求最长回文子序列的长度

解析:

1.状态表达式:

dp[i]表示:以i位置为结尾的最长回文子序列的长度;

dp[i][j]表示:在s[i,j]区间内最长的回文子序列的长度

2.状态转移方程:

                if(s[i]==s[j]){if(i==j) dp[i][j]=1;else if(i+1==j) dp[i][j]=2;else dp[i][j]=dp[i+1][j-1]+2;}else dp[i][j]=max(dp[i][j-1],dp[i+1][j]);

3.初始化:

不用初始化,因为求最长的长度,开始为0/1都可以

4.填表顺序:

由于dp内只存在这两种位置的访问情况,所以必须要先直到【i+1,j-1】才能知道【i,j】这个位置,所以填表顺序是从下往上,从左往右填表;即行数i倒着填,列数j正着填

5.返回值:

dp[0][n-1]

代码编写:

class Solution {
public:int longestPalindromeSubseq(string s) {int n=s.size();vector<vector<int>> dp(n,vector<int>(n,1));int ret=0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){if(i==j) dp[i][j]=1;else if(i+1==j) dp[i][j]=2;else dp[i][j]=dp[i+1][j-1]+2;}else dp[i][j]=max(dp[i][j-1],dp[i+1][j]);}}return dp[0][n-1];}
};

总结:

根据经验+题目要求来判断状态表达式,这题一看就是子序列,那么就可以直接上手定义dp[i][j],这样更加便捷,因为关于子序列的判断就是求在s[i,j]这个区间内的回文子序列的长度大小,然后进行分类讨论,当s[i]==s[j] 和 s[i]!=s[j]两种情况下如何求出最长回文子序列的长度

6. 让字符串成为回⽂串的最⼩插⼊次数(hard)

插入最少的次数,让该字符串成为回文串

解析:

1.状态表达式:

关于「单个字符串」问题中的「回⽂⼦序列」,或者「回⽂⼦串」,我们的状态表⽰研究的对象⼀
般都是选取原字符串中的⼀段区域 [i, j] 内部的情况。这⾥我们继续选取字符串中的⼀段区域来研究:
状态表⽰: dp[i][j] 表⽰字符串 [i, j] 区域成为回⽂⼦串的最少插⼊次数。

2.状态转移方程:

在分别判断当s[i] == s[j] 和 s[i]!=s[j]时两者的讨论方式:

由于在s[i]!=s[j]的时候,dp[i][j-1] 和 dp[i+1][j]这两个区间内都要进行一次插入,让两端的字符相等

                if(s[i]==s[j]) dp[i][j]=i+1<j?dp[i+1][j-1]:0;else dp[i][j]=min(dp[i][j-1],dp[i+1][j])+1;
关于「回⽂⼦序列」和「回⽂⼦串」的分析⽅式,⼀般都是⽐较固定的,都是选择这段区域的「左
右端点」的字符情况来分析。因为如果⼀个序列是回⽂串的话,「去掉⾸尾两个元素之后依旧是回
⽂串」,「⾸尾加上两个相同的元素之后也依旧是回⽂串」。因为,根据「⾸尾元素」的不同,可
以分为下⾯两种情况:
i. 当⾸尾两个元素「相同」的时候,也就是 s[i] == s[j]
1. 那么 [i, j] 区间内成为回⽂⼦串的最少插⼊次数,取决于 [i + 1, j - 1] 区间
内成为回⽂⼦串的最少插⼊次数;
2. i == j i == j - 1 [i + 1, j - 1] 不构成合法区间),此时只有 1 ~ 2 个相同的字符, [i, j] 区间⼀定是回⽂⼦串,成为回⽂⼦串的最少插⼊次数是此时 0。dp[i][j] = i >= j - 1 ? 0 : dp[i + 1][j - 1] 
ii. 当⾸尾两个元素「不相同」的时候,也就是 s[i] != s[j]
1. 此时可以在区间最右边补上⼀个 s[i] ,需要的最少插⼊次数是 [i + 1, j] 成为回⽂⼦串的最少插⼊次数 + 本次插⼊,即 dp[i][j] = dp[i + 1][j] + 1
2. 此时可以在区间最左边补上⼀个 s[j] ,需要的最少插⼊次数是 [i, j + 1] 成为回⽂⼦串的最少插⼊次数 + 本次插⼊,即 dp[i][j] = dp[i][j + 1] + 1
综上所述,状态转移⽅程为:
s[i] == s[j] 时: dp[i][j] = i >= j - 1 ? 1 : dp[i + 1][j -

3.初始化:

不用初始化

4.填表顺序:

从下往上,从左往右填

5.返回值:

返回dp[0][n-1];

代码编写:

class Solution {
public:int minInsertions(string s) {int n=s.size();vector<vector<int>> dp(n,vector<int>(n));for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]) dp[i][j]=i+1<j?dp[i+1][j-1]:0;else dp[i][j]=min(dp[i][j-1],dp[i+1][j])+1;}}return dp[0][n-1];}
};

总结:

这一题其实仔细总结一下,跟以前做的题目简直一模一样,只要考虑求出状态表达式和转移方程,那简直不要太轻松

总结不易~本节对我有很大帮助和收获,希望对你也是~!!!

相关文章:

专题二十三_动态规划_回文串系列问题_算法专题详细总结

目录 动态规划 回文串系列问题 1. 回⽂⼦串&#xff08;medium&#xff09; 解析&#xff1a; 解决回文串问题&#xff0c;这里提供三个思路&#xff1a; 1.中心扩展法&#xff1a;n^2 / 1 2.马拉车算法&#xff1a;n / n 3.动态规划算法&#xff1a;n^2 / n^2 1.状态表…...

Linux操作系统学习---初识环境变量

目录 ​编辑 环境变量的概念&#xff1a; 小插曲&#xff1a;main函数的第一、二个参数 获取环境变量信息&#xff1a; 1.main函数的第三个参数 2.查看单个环境变量 3.c语言库函数getenv() 和环境变量相关的操作指令&#xff1a; 1.export---导出环境变量&#xff1a; 2.unse…...

通过map文件了解堆栈分配(STM32、MDK5)--避免堆栈溢出

在最近的一个项目的开发中,每当调用到一个函数,程序就直接跑飞。debug跟进去看不出什么逻辑错误,但发现函数内局部变量声明之后,全局变量的值被清零,后来查看局部变量地址已经超出栈的范围,于是确定是栈溢出。如果不稍微了解一下堆栈,在开发过程中可能碰到各种奇怪的错误…...

设计模式——状态模式

定义 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式。它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类&#xff0c;从直观上看&#xff0c;就像是对象根据自身的状态来动态地切换行为方式。 结构组成 环境&#xff08;Conte…...

没有技术背景考软考高级选什么科目呀?

没有技术背景的外行小白特别推荐考取 信息系统项目管理师 &#xff0c;也就是软考高项&#xff01; 软考高项是软考高级资格考试中相对最容易的一门&#xff0c;同时也是报考人数最多的一门。 为什么选择软考高项呢&#xff1f; 以我自己的经历为例。 刚进入职场时&#xf…...

大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法

1. 梯度介绍 如果我们在一座山上&#xff08;一个山的坡度有很多&#xff0c;陡峭的&#xff0c;平缓的&#xff09;&#xff0c;想要从山顶下山。而梯度就像告诉我们如何沿着最陡的下坡路线走&#xff0c;以尽快到达山脚&#xff08;最低点&#xff09;。 2. 梯度的定义 梯度…...

【R语言管理】Pycharm配置R语言及使用Anaconda管理R语言虚拟环境

目录 使用Anaconda创建R语言虚拟环境1. 安装Anaconda2. 创建R语言虚拟环境 Pycharm配置R语言1. 安装Pycharm2. R Language for IntelliJ插件 参考 使用Anaconda创建R语言虚拟环境 1. 安装Anaconda Anaconda的安装可参见另一博客-【Python环境管理工具】Anaconda安装及使用教程…...

蓝桥杯每日真题 - 第24天

题目&#xff1a;&#xff08;货物摆放&#xff09; 题目描述&#xff08;12届 C&C B组D题&#xff09; 解题思路&#xff1a; 这道题的核心是求因数以及枚举验证。具体步骤如下&#xff1a; 因数分解&#xff1a; 通过逐一尝试小于等于的数&#xff0c;找到 n 的所有因数…...

mac 如何查看 export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node 是否正确

在 macOS 上&#xff0c;如果你想查看环境变量 NVM_NODEJS_ORG_MIRROR 是否已正确设置为 https://npm.taobao.org/mirrors/node&#xff0c;你可以按照以下步骤进行检查&#xff1a; 1. 检查当前环境变量值 打开终端并运行以下命令来查看 NVM_NODEJS_ORG_MIRROR 环境变量的当…...

Android 单元测试的各种环境问题记录

报错记录 failed to configure packages targetSdkVersion failed to configure com.demo.test.SettingsActivityTest.testOnCreate_withNullSavedInstanceState: Package targetSdkVersion34 > maxSdkVersion32 java.lang.IllegalArgumentException: failed to configure …...

选择使用whisper.cpp进行语音转文字

需要将一些wav格式的语音文件转成文字&#xff08;ASR&#xff0c;STT&#xff09;&#xff0c;接到这个任务后&#xff0c;首先上网搜索有没有现成免费的工具或服务可以使用。常用的关键字如“语音转文字 免费 在线”。 搜到的很多野鸡网站&#xff0c;都可以免注册免费提供短…...

推荐一款网络调试工具:常用网络调试工具2024秋季版(1.1.5.41115)

常用网络调试工具2024秋季版(1.1.5.41115) 此应用程序支持TCP/IP Server、TCP/IP Client、UDP/IP数据收发、文本模式发送与接收、HEX模式发送与接收、报文模式&#xff0c;数据模式&#xff0c;数据管理功能&#xff0c;数据导出至EXCEL报表、存贮于数据库。具体功能如下&#…...

无锁编程–C语言

原文地址&#xff1a;无锁编程–C语言 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 锁带来的开销是比较大的&#xff0c;对于高并发处理的数据&#xff0c;使用一些原子操作函数&#xff0c;可以有效避免上锁的开销。 GCC内置了一些原子操作…...

C/C++绘制爱心

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/…...

架构师思维中的人、产品和技术

架构思维主要是一种以产品和业务为驱动的顶层解决问题的思维,需要同时考虑产品、人和技术3重关系,思维点需要同时落在三维体系中。虽然架构师很多时候做的工作其实只是分和合,即所谓的系统分拆及重新组合,但综合能力要求很高,需要同时具备思维的高度和深度,在思维抽象的同…...

数学知识1

人工智能的四要素是算法、算力、数据和场景&#xff0c;之所以能够智能&#xff0c;离不开长期发展的数学原理&#xff0c;人工智能背后强有力的支撑便是数学、物理等基础学科&#xff0c;本篇笔者浅谈、分享一下个人详学习人工智能的一个前期知识储备阶段对数学方面的积累&…...

git: 修改gitlab仓库提交地址

git: 修改gitlab仓库提交地址 右键git bash here 1、进入到项目my-project所在位置 2、查看当前项目远程仓库地址 3、修改远程仓库地址 4、再次查看新的远程仓库地址以确认修改成功 cd /my-project git remote -v # 查看当前远程仓库地址 git remote set-url origin 新的Gi…...

mac 安装node提示 nvm install v14.21.3 failed可能存在问题

如果你在 macOS 上使用 nvm&#xff08;Node Version Manager&#xff09;安装 Node.js 版本 v14.21.3 时遇到安装失败的问题&#xff0c;可以按照以下步骤进行排查和解决&#xff1a; 1. 确认 nvm 安装是否正确 首先&#xff0c;确认你的 nvm 是否正确安装&#xff0c;并且能…...

MySQL基础知识大总结

一&#xff0c;介绍 数据库是什么&#xff0c;我们在学习其他编程语言的时候会使用数组呀&#xff0c;链表&#xff0c;二叉树等等一些数据结构来存储我们的数据&#xff0c;但是大家有没有发现我们一旦关闭程序&#xff0c;所有的数据都没有了&#xff0c;这在发行的软件来看是…...

取石子游戏

取石子游戏 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; Alice 和 Bob 在玩一个古老的游戏。现在有若干堆石子&#xff0c;Alice 和 Bob 轮流取&#xff0c;每次可以 选择其中某一堆的石子中取出任意颗石子&#xff0c;但不能不取&#x…...

对象的大小

文章目录 一、对象大小 一、对象大小 对象是类实例化出来的&#xff0c;让我们分析一下类对象中哪些成员呢&#xff1f; 类实例化出的每个对象&#xff0c;每个都有独立的数据空间&#xff0c;所以对象中肯定包含 成员变量&#xff0c;那么成员函数是否包含呢&#xff1f; 首…...

基于Boost库的搜索引擎

本专栏内容为&#xff1a;项目专栏 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;基于Boots的搜索引擎 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识…...

springMVC 全局异常统一处理

全局异常处理⽅式⼀: 1、配置简单异常处理器 配置 SimpleMappingExceptionResolver 对象: <!-- 配置全局异常统⼀处理的 Bean &#xff08;简单异常处理器&#xff09; --> <bean class"org.springframework.web.servlet.handler.SimpleMappingExceptionReso…...

Java面试之多线程并发篇

前言 本来想着给自己放松一下&#xff0c;刷刷博客&#xff0c;突然被几道面试题难倒&#xff01;说一说自己对于 synchronized 关键字的了解&#xff1f;说说自己是怎么使用 synchronized 关键字&#xff1f;什么是线程安全&#xff1f;Vector是一个线程安全类吗&#xff1f;…...

我的创作之路:机缘、收获、日常与未来的憧憬

目录 前言机缘收获 日常成就一个优化后的二分查找实现 憧憬 前言 每个人的成长旅程都有它独特的轨迹&#xff0c;而我的这段技术创作之路&#xff0c;则源于一次再普通不过的项目分享。 机缘 一切的开始其实是偶然。在一次项目中&#xff0c;我遇到了一个棘手的问题&#xf…...

将服务器上的服务映射到本地使用

使用 win R &#xff0c;输入CMD打开命令行。 ssh -CNg -L 6666:127.0.0.1:8888 rooti-1.gpushare.com -p 53310 从右到左介绍&#xff1a; 53310&#xff1a;服务器的端口号。 i-1.gpushare.com&#xff1a;主机。 8888&#xff1a;服务器上服务所在的端口。 6666&…...

【C++动态规划 子集状态压缩】2002. 两个回文子序列长度的最大乘积|1869

本文涉及知识点 C动态规划 位运算、状态压缩、枚举子集汇总 LeetCode2002. 两个回文子序列长度的最大乘积 给你一个字符串 s &#xff0c;请你找到 s 中两个 不相交回文子序列 &#xff0c;使得它们长度的 乘积最大 。两个子序列在原字符串中如果没有任何相同下标的字符&…...

SQL注入--理论--堆叠注入

什么是堆叠注入&#xff1f; 在SQL语句操作的时候&#xff0c;每个语句都是以分号;标志结尾的。 在我们注入的过程中&#xff0c;通过使用多个分号同时进行多个SQL语句的注入&#xff0c;就是堆叠注入。 例如&#xff1a; ?inject1;handler 1919810931114514 open;handler 1…...

CSS —— 子绝父相

相对定位&#xff1a;占位&#xff1b;不脱标 绝对定位&#xff1a;不占位&#xff1b;脱标 希望子元素相对于父元素定位&#xff0c;又不希望父元素脱标&#xff08;父元素占位&#xff09; 子级是 绝对定位&#xff0c;不会占有位置&#xff0c; 可以放到父盒子里面的任何一…...

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…...

IDEA如何快速地重写方法,如equals、toString等

前言 大家好&#xff0c;我是小徐啊。我们在使用IDEA的时候&#xff0c;有时候是需要重写equals和toString等方法的。这在IDEA中已经很方便的给我们准备好了快速的操作了。今天就来讲解一下。 如何重写 首先&#xff0c;打开要重写方法的文件&#xff0c;让鼠标定位到这个文…...

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…...

打造智能扩容新纪元:Kubernetes Custom Metrics深度解析

自定义指标:Kubernetes Auto Scaling的革命 1. 引言 1.1 Kubernetes与Auto Scaling Kubernetes作为当今容器编排的事实标准,提供了强大的自动化能力,其中Auto Scaling(自动扩缩容)是其核心特性之一。Auto Scaling允许Kubernetes集群根据当前负载动态调整资源,以应对不…...

网络安全工具软件 BlackICE

网络安全工具软件BlackICE的使用和设置说明简介(转)   BlackICE 在九九年获得了PC Magazine的技术卓越大奖&#xff0c;专家对它的评语是&#xff1a;“对于没有防火墙的家庭用户来说&#xff0c;BlackICE是一道不可缺少的防线&#xff1b;而对于企业网络&#xff0c;它又增加…...

深入解析分布式优化算法及其Python实现

目录 深入解析分布式优化算法及其Python实现第一部分:分布式优化算法的背景与原理1.1 什么是分布式优化算法?1.2 分布式优化算法的分类1.3 应用场景1.4 分布式优化的关键挑战第二部分:分布式优化算法的通用Python实现2.1 基本组件的实现第三部分:案例1 - 基于梯度下降的分布…...

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…...

打包多个python文件为exe

要使用PyInstaller打包多个Python文件为单个可执行文件(exe),需要执行以下步骤: 安装PyInstaller 如果尚未安装PyInstaller,请打开命令提示符或终端,输入以下命令进行安装: pip install pyinstaller进入Python脚本所在目录 使用命令行工具(如cmd或终端)导航到包含Python脚本…...

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中&#xff0c;处理 Excel 文件的导入导出是极为常见的需求。 今天&#xff0c;咱们就一起来深入了解一款非常实用的操作 Exce…...

基础免杀 从.rsrc加载shellcode上线

.rsrc 段是PE文件中的一个特定部分&#xff0c;专门用来存储资源数据。这些资源通常包括图标、位图、字符串表、对话框、菜单、版本信息、字体等 具体的shellcode加载方式不在此探讨 在这使用传统的指针执行 WindowsAPI 需要用到如下API FindResource 获取指定资源的信息块…...

Spring MVC 深度剖析:优势与劣势全面解读

文章目录 Spring MVC 优势1. **松耦合**2. **易于测试**3. **灵活性**4. **强大的配置机制**5. **异常处理**6. **国际化支持**7. **数据验证**8. **安全性**9. **性能优化** Spring MVC 劣势1. **学习曲线**2. **配置复杂性**3. **性能开销**4. **视图技术限制**5. **社区和支…...

基于Angular+BootStrap+SpringBoot简单的购物网站

目录 一、项目结构图 二、目录结构解析 后端 (Spring Boot) 前端 (Angular) 三、技术栈 四、具体功能实现 五、数据库设计 六、后端实现 1. 设置Spring Boot项目 2. 数据库实体类 3. 创建Repository 4. 创建Service层 5. 创建Controller层 七、前端实现&#xff0…...

微软Ignite 2024:建立一个Agentic世界!

在今年的Microsoft Ignite 2024上&#xff0c;AI Agent无疑成为本次大会的重点&#xff0c;已经有十万家企业通过Copilot Studio创建智能体了。微软更是宣布&#xff1a;企业可以在智能体中&#xff0c;使用Azure目录中1800个LLM中的任何一个模型了&#xff01; 建立一个Agent…...

AIGC实践-使用Amazon Bedrock的SDXL模型进行文生图

一、Bedrock 简介 Amazon Bedrock 是 Amazon Web Services (AWS) 提供的一种生成式 AI 服务。通过 Bedrock&#xff0c;用户可以方便地使用多种基础模型&#xff08;Foundation Models&#xff09;&#xff0c;包括 OpenAI 的 GPT、Anthropic 的 Claude 等。这些模型可以用于各…...

Android12 mtk设置插充电器自动开机

Android12 mtk平台通常关机后&#xff0c;插上充电器是进入关机充电流程&#xff0c;显示关机充电动画。 那么根据用户需求&#xff0c;如果需要设置关机之后&#xff0c;实现插上充电器后&#xff0c;自动开机。 正常流程&#xff1a;机器关机 --> 插上充电器 --> 显示…...

Linux高阶——1117—TCP客户端服务端

目录 1、sock.h socket常用函数 网络初始化函数 首次响应函数 测试IO处理函数 获取时间函数 总代码 2、sock.c SOCKET() ACCEPT()——服务端使用这个函数等待客户端连接 CONNECT()——客户端使用这个函数连接服务端 BIND()——一般只有服务端使用 LISTEN()——服务端…...

Linux 命令和 vi/vim 命令

Linux 命令概览 1. 文件和目录操作 列出目录内容 ls&#xff1a;列出当前目录内容ls -l&#xff1a;以长格式列出ls -a&#xff1a;显示隐藏文件ls -lh&#xff1a;以长格式和人类可读方式显示大小ls -R&#xff1a;递归列出子目录ls -d */&#xff1a;仅列出目录ls -t&#x…...

鸿蒙征文|鸿蒙心路旅程:始于杭研所集训营,升华于横店

始于杭研所 在2024年7月&#xff0c;我踏上了一段全新的旅程&#xff0c;前往风景如画的杭州&#xff0c;参加华为杭研所举办的鲲鹏&昇腾集训营。这是一个专门为开发者设计的培训项目&#xff0c;中途深入学习HarmonyOS相关技术。对于我这样一个对技术充满热情的学生来说&…...

【docker】docker commit 命令 将当前容器的状态保存为一个新的镜像

在Docker容器中安装了许多软件&#xff0c;并希望将当前容器的状态保存为一个新的镜像&#xff0c;可以使用docker commit命令来创建一个新的镜像。以下是如何操作的步骤&#xff1a; 找到容器ID或名称&#xff1a; 首先&#xff0c;需要找到想要保存的容器的ID或名称。可以使用…...

Java基础1.0

1.Java有哪些数据结构 Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体数据结构&#xff0c;在内存中分配了不同大小的内存空间。 基本数据结构 整数类型&#xff1a;byte&#xff0c;short&#xff0c;long&#xff0c;int。 字符类型&#xff1a;doub…...

完全二叉树的基本操作(顺序存储)

#include<iostream> #include<math.h> using namespace std;#define MaxSize 100 struct TreeNode {int value;bool isEmpty;//判断该节点是否为空 }t[MaxSize];/** *定义一个长度位MaxSize的数组&#xff0c;按照从上到下&#xff0c; *从左到右的方式依次存储完全…...