678

不一样的地方是多了个任意符*,那就额外计任意符的数量
如果任意符要换成左括号,那说明后面有多余的右括号
如果要换成右括号,那就是前面有多的左括号
还是要用个新栈来计任意符的位置
当遇到右括号时,优先匹配栈中最近的左括号或任意符
然后到最后的时候,如果左括号栈中还有剩余,就尝试用任意符栈中的元素来去配平,同时检验其位置是否合法,即任意符栈中的元素必须比左括号要靠后,任意符栈最后可以不为空

应该优先用左字符的,最后再用任意符
cpp
class Solution {
public:
bool checkValidString(string s) {
stack<int>left,ran;
int n=s.size();
for(int i=0;i<n;i++){
if(s[i]=='('){
left.push(i);
}else if(s[i]=='*'){
ran.push(i);
}else{
if(left.empty()&&ran.empty()){return false;}
else if(left.empty()){ran.pop();}
else{
left.pop();
}
}
}
while(!left.empty()){
if(ran.empty()){return false;}
int cur=left.top(),match=ran.top();
if(match<cur){return false;}
left.pop();
ran.pop();
}
return true;
}
};
4070

如果暴力的话,那就是计算正向拨和反向拨的次数,比较后选最小的
如果正向拨,那他就是在前面,应该加9再模9,即目标数字+9-起点然后再mod9
如果反向拨,那目标在后面,从目标到起点,应该是起点+9-目标数字,再mod9
是否存在统一的公式?可以每次不比较?
题解AI


4071

这个就是说选择一个下标,然后从这个下标开始往后的所有字符都反转
然后求整体可能的一个最少旋转次数
如果依然暴力的话,那就是尝试从头到尾都试着反转,然后再依次求解
On^2,可能不会超时
但是还是超时了

题解AI

为什么反转字符串后,内部相邻距离不变?


就是说,先直接对原来的算出结果
然后再逐一尝试反转
但是是可以由一个公式直接计算得到反转后的代价
直接取min即可
假设反转的位置是i,那么原来的代价是d(i-1,i),现在是d(i-1,n-1)
所以代价就是base-d(i-1,i)+d(i-1,n-1)

4072

这个可以选择删除一个元素,然后调整后续的数组下标,使其都-1
然后还有就是要选子数组,是连续的序列
目前完全没什么思路
暴力目测也完全行不通
状态机DP





当要构成子数组求答案时,自身原始下标是否有意义?
通过选择,即使未删除元素,以及如果自己原始是在偶数下标,是否也可能会被变成奇数?
那就是说直接看在子数组中的下标奇偶
如果是偶数,那可能构成开头,又或者必须衔接上奇数
但由于子数组连续的特质在,如果是要连接,就必须连接上一个紧邻的元素的DP
而如果是奇数,那构不成开头,必须连接

此外,这个删除状态有什么用?既然是会通过选择来改变在子数组当中的奇偶性?以及既然是删除,那如何知道的删除的哪个元素?就是在衔接的时候,怎么确定不是紧邻的上一个元素被删除了?
意思就是说,对于当前DP的四个值,DP0和1都是对应还没发生删除的状况
那就是DP0=max(val,原始数组中的上一个元素的DP1+val)
DP1=原始数组中的上一个元素的DP0-val
然后如果发生删除
DP2=max(val【自己依然可以当开头元素?】,
若衔接元素和原始数组中一致(即没删掉上一个元素),则为原始数组中上一个元素的DP3+val
若不一致,说明就是删掉的上一个元素,那应该找原始数组的上上个元素,即为上上个元素的DP1+val
DP3=max(
若一致,则为原始数组上一个元素的DP2-val,
若不一致,则为原始数组上上个元素的DP0-val)

就是说题意是先删除然后再取子数组,但在DP时,2和3的状态就是默认删除发生在子数组当中,或者说顺序是先取了子数组,然后再删除的



4073


这个看上去还行
对于每个n,如果为奇数,那么+2答案,即两个全a全b的
如果是偶数,考虑向下拆分,拆成s1+s2,
如果s1为奇数,那么s2也是奇数
那么s1的组合情况可以和s2的相乘
如果s1为偶数,那么s2也是偶数
那么s1,s2各自都得继续向下拆分
或许也是乘的关系?
当n=1的时候,为a,b
当n=2的时候,只能拆成1+1,如果拆出的奇数相等,那或许是对应奇数的数量?
忘记了关键条件是,s1最后一个字符和s2第一个不能相同,那或许直接除以2就行?
如果DPi表示i时的结果数量
为奇数时,首先要+2
然后拆分,拆成奇数和偶数
那就是dpk*dpi=k
为偶数时,拆成偶数和偶数,以及奇数和奇数
题解AI
"所以,固定第一个字符后,一个长度为 n 的好串完全由"把 n 拆成若干个正奇数之和"的方案决定"什么叫固定第一个字符?是说选定A或B吗,以及为什么由"把 n 拆成若干个正奇数之和"的方案"所决定?这个和斐波那契数列又有什么关系

为什么要固定第一个字符呢?就算固定了,第二个字符也可以是a或b啊,因为他们可以和第一个字符组合在一起形成一个串?




就是说不要关注每个位置上的字符,而是去关注每个块上的字符
第二个字符可以是A或B,但第二块上的字符一定是B
第二个字符是A是B只取决于它到底在第一块还是第二块上
而不断往下拆块,最终每个块,即每个叶子,一定是奇数长度的、相同字符构成的
那就是看给定数字N,拆成若干个正奇数之和,有多少种拆法

这个推导有说法