10.4【A】

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,拆成若干个正奇数之和,有多少种拆法

这个推导有说法

相关推荐
Godspeed Zhao1 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)1 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy1 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
小O的算法实验室1 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09111 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
言乐62 小时前
Python体现逻辑回归和决策树的区别
开发语言·python·算法·决策树·逻辑回归
HugoStudio_SWAN2 小时前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法
红豆诗人2 小时前
C++二叉搜索树:查找、插入和删除为什么这样写
数据结构·c++·算法