[算法周训 5]

算法周训5,本来这应该就发了的,一直拖到了现在,总结一部分还是有所欠缺,希望接下来继续吧。

主要题目以回文、暴力法,dp解决。

重新格式化电话号码

在这里插入图片描述
分析一下题目,主体思想就是分组,只需要遍历string就可以。不过这个题目我就是单纯地模拟运算,主要要讨论最后的数字与3的关系,具体见下:

class Solution {
public:
    string reformatNumber(string number) {
        string s="";
        for(int i=0;i<number.size();i++) {
            if(number[i] != ' ' && number[i] != '-') {
                s += number[i];
            }
        }

        int n = s.size();
        int m = n%3;
        string t = "";
        if(m == 0 || m ==2) {
            for(int i=0;i<s.size();i++) {
                t += s[i];
                if( i%3 == 2 && i != s.size()-1 ) {
                    t += '-';
                }
            }
        }
        if( m == 1) {
            for(int i=0;i<s.size()-4;i++) {
                t += s[i];
                if( i%3 == 2 && i != s.size()-1  ) {
                    t += '-';
                }
            }
            t += s[s.size()-4] ;
            t += + s[s.size()-3] ;
            t += '-';
            t += s[s.size()-2] ;
            t += s[s.size()-1] ;
        }
        
        return t;
    }
};

在LR交换相邻字符

在这里插入图片描述
这个题目主要的思想就是将X删除,然后比较R与L。

class Solution {
public:
    bool canTransform(string start, string end) {
        int n = start.size(),sx =0 ,ex = 0;
        for(int  i=0,j=0;i<n || j<n ;i++,j++) {
            while(start[i] == 'X') {
                sx++;
                i++;
            }
            while(end[j] == 'X') {
                ex++;
                j++;
            }

            if(start[i] != end[j]) return false;
            if(start[i] == 'L' && sx < ex) return false;
            if(start[i] == 'R' && sx > ex) return false;
        }

        return true;
    }
};

相同的树

在这里插入图片描述
常规思路题目,一直递归遍历就可以

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q){
            return true;
        }
        else if(!q ^ !p){
            return false;
        }
        else if(q->val!= p->val){
            return false;
        }
        else{
            return (isSameTree(p->left , q->left )&& isSameTree(p->right , q->right) );
        }
    }
};

最长回文子串

在这里插入图片描述
暴力法解决

class Solution {
public:
    string longestPalindrome(string s) {
        string res;
        for (int i = 0; i < s.size(); i ++) {
            int l = i - 1, r = i + 1;
            while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
            if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);

            l = i - 1; r = i;
            while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
            if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1); 
        }
        return res;
    }
};


无重复字符的最长子串

在这里插入图片描述
双指针问题

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> hash;
        int res = 0;
        for (int i = 0, j = 0; i < s.size(); i++) {
            hash[s[i]]++;
            while (hash[s[i]] > 1) hash[s[j++]]--;
            res = max(res, i - j + 1);
        }
        return res;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值