ARTS-Week-05

Algorithm

最长合法括号Leetcode: Longest Valid Parentheses

题意:给定一个只包含‘( ’ 和 ‘ )’的字符串,找出这个字符串中,最长的合法括弧子串,例如
‘(()’ 最长合法为2, ‘(())’,最长合法为4

思路一:使用栈的思路来解决,当遇到‘( ’时,入栈;遇到‘ )’时,查看栈顶是否存在‘( ’,如果存在,弹出,表示当前‘ )’遇到了与之匹配的‘( ’,不存在的话,就表明当前‘ )’没有与之匹配的‘( ’,则当前这个符号表明了一个分割点,即这个位置之前合法子串不能在连续,这个位置之后的合法子串要重新开始。如果我们找到所有的分割点,将字符串分割成多个合法子串,然后求最长合法子串的长度即可。

class Solution {
public:
    int longestValidParentheses(string s) {
        int cnt = 0;
        stack<int> st;
        for (int i = 0; i < static_cast<int>(s.length()); i++) {
           if (s[i] == '(') { //遇到(入栈下标
               st.push(i);
           } else {
               if (!st.empty()) {
                   if (s[st.top()] == '(') { //遇到),栈顶有(,则栈顶弹出;否则继续入栈下标,当前)为一个分割点
                       st.pop();
                   } else {
                       st.push(i);
                   }
               } else {
                   st.push(i);
               }
           }
        }
        
        vector<int> res;
        while (!st.empty()) { //记录分割点下标
            res.push_back(st.top());
            st.pop();
        } 
        
        reverse(res.begin(), res.end());
        
        int cur = 0;
        int maxn = 0;
        //计算最长合法长度
        for (int i = 0; i < static_cast<int>(res.size()); i++) {
            // cout << res[i] << endl;
            maxn = max(maxn, res[i] - cur);
            cur = res[i] + 1;
        }
        maxn = max(maxn, static_cast<int>(s.length())-cur);
        
        return maxn;
    }
};

思路二:动态规划
使用vec[n]表示,记录了子串以s[n]为终点的最长合法括弧长度,求得vec之后,找到最大值即可;
如果s[i] = ‘(’,则vec[i] = 0;
如果s[i] = ‘)’,则看s[i-1],若s[i-1]为’(’,则vec[i] = vec[i-2] + 2,表示我们找到一对匹配的括弧,使得之前的合法性得以连续; 若s[i-1]为’)’,则需要往前找到一个’('与之匹配,这个过程需要跳过中间一个合法性的子串,由于vec[i-1]记录了这个合法性子串长度,vec[i] = vec[i-1] + 2 + vec[i - vec[i-1] - 2]; 如果没有找到,vec[i] = 0;

class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> vec(s.length(), 0);
        int maxn = 0;
        for (int i = 1; i < s.length(); i++) {
            if (s[i] == ')' && i-vec[i-1]-1 >= 0 && s[i-vec[i-1]-1] == '(') {
                vec[i] = vec[i-1] + 2 + (i-vec[i-1]-2 >= 0 ? vec[i-vec[i-1]-2] : 0); 
                maxn = max(maxn, vec[i]);
            }
        }
        return maxn;
    }
};

Review
Good Engineering Practices while Working Solo
这篇文章主要介绍了一些好的工程实践方法,能够对我们日常工作带来帮助:
建立工作流
1)提出issues,记录开发过程;2)使用Pull request;3)让别人审阅自己的代码,为什么这么实现?会导致什么错误?还有没有更好的办法?4)维护有意义的Git历史,保持有意义的commit消息,思考这次提交我试图完成什么?怎么完成的?
管理开发组件
收集,管理,常用的开发组件,可以使用Bit等组件管理工具
整理文档
1) 意识到不是写一本书,保持简洁明了;2)在code之前写文档,定义好程序接口,需求;3)coding记录文档,重点在哪里?介绍使用,并及时更新之前的文档;4)写好注释;5)根据单元来进行记录文档,可以适当提升单元层级,减少繁琐
沟通交流
及时和团队和客户沟通你遇到的困难,可以让你的客户意识到项目的进展,让团队明白需要修改计划,有时你解决不了的事情,团队内有人能提供帮助
监测
1)捕获日志和评测;2)建立方便查阅日志的系统;3)不要忽视错误;4)检查捕获到的日志和评测
观察和迭代
通过观察,可以获取当前程序的运行效果,然后思考迭代改进当前程序。

Tips
虚拟机用来本地编译Linux环境程序,可以使用ssh连接虚拟机,我们可以将虚拟机关闭图形界面启动:

#切换到root,执行命令
systemctl disable lightdm.service
reboot

1)vitrualbox,设置端口转发,可以通过连接主机端口,转发到虚拟机端口
ARTS-Week-05_第1张图片
2)ssh连接,使用xshell,建立连接
在这里插入图片描述
Share
本周项目小节,使用到了下Python的一些模块,小节了一下,以后继续更新
python常用函数

你可能感兴趣的:(ARTS)