可以给已有的markdown文章批量添加hexo头部信息,且遵从hexo scaffolds的模板格式。
使用方法
- 在hexo博客的根目录下创建一个空的文件夹(推荐使用英文名称)。
- 将”hexoer.py”移动到新创建的文件夹中。
- 复制所有待修改的markdown文件到新创建的文件夹中。
python hexoer.py
并等待完成。
数据库的隔离级别主要有四种:
以上四种隔离级别,隔离级别越高,数据一致性越好,但并发性能越差。因此在实际应用中,需要根据业务需求和系统负载情况,选择合适的隔离级别。
设dp[i][j]
代表s的前i个字符和t的前j个字符满足题目的匹配要求的个数,则dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
,当s[i-1] == t[j-1]
时;dp[i][j] = dp[i-1][j]
,当s[i-1] != t[j-1]
时。
原因是要满足题目要求,t的字符必须全部匹配,故t[0~j-1]必选。
对于s[i-1],如果可匹配则可选可不选;如果不匹配,则不选。
初始化dp[i][0] = 1, dp[0][j>0] = 0.
时间O(mn)
,空间O(mn)
。
1 | class Solution { |
方法1中更新dp[i][j]只用到了dp[i-1][j-1]和dp[i-1][j],因此可以在空间上进行优化。
空间上只保留一行,同时j逆序更新。
时间O(mn)
,空间O(n)
。
使用一个辅助栈记录当前期待访问的是栈中元素的左子节点还是右子节点。
如果栈顶记录的是左子节点,则修改为期待访问右子节点。
如果栈顶记录的是右子节点,代表当前访问的节点是其右子节点,弹出栈顶。
如果访问的是数字,将其入栈,之后访问的是它的子树。
如果访问的是#,不入栈,因为其对应的栈顶节点的左子树或者右子树为空。
时间O(n)
,空间O(n)
。
1 | class Solution { |
O(1)
方法1中使用的栈记录了当前期待的是每个节点的左子树还是右子树,使得我们可以直接构建出这棵树。
但实际上并不需要这么详细的信息,因为每个节点都是首先期待左子树,之后期待右子树,然后出栈。
所以我们可以只用一个变量记录栈中节点期待的子树的总数目,当遇到下一个节点时,期待–。减小的期待可能是栈顶节点的左子树也可能是其右子树,但我们并不关心。
所以将方法1中的栈改为一个整型变量expect
,模拟一个虚拟栈即可。
时间O(n)
,空间O(1)
。
一个栈存操作数,一个栈存操作符。
为了避免-1+2
和1+(-2+3)
等情况,还要判断操作符的上一位,看是否需要在操作数栈中添加0.
时间O(n)
,空间O(n)
。
1 | class Solution { |
算式中只有加减法,因此可以全部看作是加法,将减法看作是负数。
还是使用辅助栈,不过栈只存正负号,代表当前括号外部是正号还是负号。
时间O(n)
,空间O(n)
。
设dp[i]
是以s[i]
为结尾的子串的最少分割次数,则dp[i] = min(dp[j-1]+1)
,j
是i
左侧的位置,s[j~i]
是s[0~i]
最后一个回文串。
从后遍历所有的回文串,找到分割最短的。
使用预处理之后,以O(1)
的时间判断s[i][j]
的回文性。
时间O(n^2)
,空间O(n^2)
。
1 | class Solution { |
类似“全排列”,对于每个子答案:
时间复杂度O(n * 2^n)
;这里n为输入字符串的长度,每一个位置可拆分,也可不拆分,尝试所有拆分的时间复杂度为O(2^n
,判断每一个子串是否是回文子串,时间复杂度为O(n)
当然也可以用O(n^2)
的时间预处理计算出每一段子串s[i][j]是否回文,则之后可以以O(1)
的时间获取,不过空间要增加到O(n^2)
空间复杂度:O(n)
,递归调用栈的深度
1 | class Solution { |
1 | class Solution { |
方法1会修改n,且由于右移如果是负数,最高位补的是1,故不能写while(n)
方法2使用一个辅助变量,不是右移n,而是左移辅助变量
1 | class Solution { |
1 | class Solution { |
使用一个单调递减栈遍历nums2
,当元素比栈顶小时入栈;当比栈顶大时代表该元素是栈顶及随后一部分比该元素小的元素的“下一个更大元素”,故弹出较小的元素,将该元素作为他们的“下一个更大元素”,将该元素入栈。
这样求得的是所有元素的“下一个更大元素”,需要hash表记录一下,最后只取nums1
中对应的。
时间O(m + n)
,空间O(m + n)
。
1 | class Solution { |