32/234/114

32.最长有效括号

class Solution {
public:
    int longestValidParentheses(string s) {
        int maxans=0;
        int n=s.length();
        vector<int> dp(n,0);
        for(int i=1;i<n;i++){
            if(s[i]==')')//只有当)结尾时会存在长度值
            {
                //说明是个成对的,看是否前面也有成对的,没有的话直接为0+2
                if(s[i-1]=='('){
                    dp[i] =(i>=2?dp[i-2]:0)+2;
                }else if(i-dp[i-1]>0&&s[i-dp[i-1]-1]=='('){//直接等于0就说明前面就一对括号,没有相匹配的了
                //那就直接跳过,如果再前面还有一个(,那就得加2,
                //分为两部分,如果再前面存在两个以上的括号,就在那个基础上加2,如果前面没有完整的2个,那么直接在原基础上加2就行
                    dp[i] = dp[i - 1] + (i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
                }
                maxans = max(maxans, dp[i]);
            }
        }
    return maxans;
    }
};

234.回文链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        //创建数组来存链表的值,然后运用双指针
        vector<int> vals;
        while(head!=nullptr){
            vals.emplace_back(head->val);//比push_back多用内存少
            head=head->next;
        }
        for(int i=0,j=vals.size()-1;i<j;i++,j--){
            if(vals[i]!=vals[j]){
                return false;
            }
        }
        return true;
    }
};

94.二叉树的中序遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector<int>& vec){
        //终止条件
        if(cur==NULL) return;
        //单层
        traversal(cur->left,vec);
        vec.push_back(cur->val);//中
        traversal(cur->right,vec);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};

114.二叉树展开为链表

前序遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void flatten(TreeNode* root) {
        //创建返回结果的二叉树
        vector<TreeNode*> l;
        preorderTraversal(root,l);
        int n=l.size();
        //构建返回值的二叉树
        for(int i=1;i<n;i++){
            TreeNode *cur = l.at(i);
            TreeNode *prev = l.at(i-1);
            prev->left = NULL;
            prev->right = cur;
        }

    }

    void preorderTraversal(TreeNode* root,vector<TreeNode*> &l){
        if(root==nullptr) return;
        l.push_back(root);
        preorderTraversal(root->left,l);
        preorderTraversal(root->right,l);
        
    }
};

394.字符串解码

class Solution {
public:
//按引用传递,会在原来的数值上改变
    string getDigits(string &s,size_t &ptr){
        string ret ="";
        //数字直接入栈;
        while(isdigit(s[ptr])){
            ret.push_back(s[ptr++]);//然后指向下一个字符
        }
        //将数字返回
        return ret;
    }

    string getString(vector <string> &v){
        string ret;//拼接
        for(const auto &s:v){
            ret +=s;
        }
        return ret;
    }

    string decodeString(string s) {
//用来解析的栈
    vector<string> stk;
    size_t ptr =0;//数组下标

    while(ptr<s.size()){
        char cur = s[ptr];
    //isdigit 检查是否为数字字符
    if(isdigit(cur)){
        //获取一个数字进栈
        string digits = getDigits(s,ptr);
        stk.push_back(digits);//将数字整体加入
    }else if(isalpha(cur)||cur =='['){
        //获取一个字母并且入栈
        stk.push_back(string(1,s[ptr++]));
    }else{
        //如果当前的字符为右括号,开始出栈,直到左括号出栈
        //2[a2[bc]]
        //拼接字符串
        ++ptr;//跳过],指向下一个]//指向空
        vector<string> sub;
        while(stk.back()!='['){
            sub.push_back(stk.back());
            stk.pop_back();
        }
        //cb//cbcba
        reverse(sub.begin(),sub.end());
        //bc//abcbc
        stk.pop_back();//左括号出栈
        //此时栈顶应为sub对应出现的次数
        int reptime = stoi(stk.back());
        stk.pop_back();
        string t,o = getString(sub);//拼接单个字符串
        //构造多个字符串
        while(reptime--) t+=o;
        //将构造好的字符串入栈bcbc入栈
        stk.push_back(t);
    }
    }
        return getString(stk);
    }

};

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值