当前位置: 首页 > news >正文

双指针算法-day11(双序列双指针)

1.比较含退格的字符串

题目

解析

  • 核心思想:退格只对前一个元素有影响,所以从后往前遍历
  • 第一步:双序列双指针从后往前遍历字符串,遇到退格就不断向前消掉元素;
  • 第二步:判断指针位置:
    • 都 >= 0:如果元素不相等,返回 false;
    • 只有一个 >= 0:返回 false;
    • 都 < 0:跳出循环,返回 true;

代码

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        // 时间复杂度:O(m + n)
        // 空间复杂度:O(1)

        int n = s.size(),m = t.size();
        int skipS = 0,skipT = 0;// 记录字符串中'#'数量

        int i = n - 1,j = m - 1;
        while(i >= 0 || j >= 0){
            // 从后往前消掉 s 中的 '#'
            while(i >= 0){
                if(s[i] == '#'){
                    skipS ++, i --;
                }else if(skipS > 0){
                    skipS --, i --;
                }else{
                    break;
                }
            }

            // 从后往前消掉 t 中的 '#'
            while(j >= 0){
                if(t[j] == '#'){
                    skipT ++, j --;
                }else if(skipT > 0){
                    skipT --, j --;
                }else{
                    break;
                }
            }

            // i,j 都没有遍历完,继续比较字符
            if(i >= 0 && j >= 0){
                if(s[i] != t[j]){
                    return false;
                }
            }else if(i >= 0 || j >= 0){ // 只有一个遍历完了
                return false;
            }

            i --,j --;
        }

        return true;
    }
};

2.情感丰富的文字

题目

解析

  • 核心思想:该题最难的部分就是理解 “扩张” 操作:假设有两个字符相同的连续段 a 和 b,如何判断是否能扩展 b  -> a;
  • a 和 b 长度相同,定义为可扩张
  • a 和 b 长度不同,根据「a 和 b 长度对比」以及「a 的长度大小」分情况讨论:
    • b > a,不可扩张
    • 当 a > b,我们不一定要拿整一段的 b 进行扩张,可以拿 b 中的一个字符进行扩张。 因此只需要满足 a 扩张后的长度大于等于 3 即可定义为可扩张。

代码

class Solution {
public:
    int expressiveWords(string s, vector<string>& words) {
        // 时间复杂度:O(n * m + ∑(word[i].size()))
        // 空间复杂度:O(1)

        int n = s.size();
        int ans = 0;

        for(string word : words){
            int m = word.size(),i = 0,j = 0;

            // word 为模版字符串,s 为扩展字符串
            while(i < n && j < m){
                if(s[i] != word[j]) break;// 字母不相等

                // 分别找到 s,word 连续相同字符长度 a,b
                int a = i,b = j;
                while(a < n && s[a] == s[i]) a ++;
                while(b < m && word[b] == word[j]) b ++;
                a -= i,b -= j;

                // 如果长度不相等,且扩展的长度 a < b 模版长度,不可扩展
                // 如果扩展长度 a < 3,也不可扩展
                if(a != b && (a < b || a < 3)) break;

                // 更新指针,继续遍历下一个元素
                i += a,j += b;
            }

            if(i == n && j == m) ans ++;
        }

        return ans;
    }
};

3.最小差

题目

解析

  • 核心思想:两个序列数字进行比较,数字更小的指针移动

代码

class Solution {
    typedef long long ll;
public:
    int smallestDifference(vector<int>& a, vector<int>& b) {
        // 时间复杂度:O(nlogn + mlogm)
        // 空间复杂度:O(1)

        int n = a.size(),m = b.size();
        ll ans = INT_MAX;
        
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());

        int i = 0,j = 0;
        while(i < n && j < m){
            if(a[i] == b[j]) return 0;
            else {
                ans = min(ans,abs((ll)a[i] - (ll)b[j]));

                if(a[i] > b[j]) j ++;
                else i ++;
            } 
        }

        return ans;
    }
};

相关文章:

  • 用hexo初始化博客执行hexo init时碰到的问题
  • 【即插即用涨点模块】EGA边缘引导注意力:有效保留高频边缘信息,提升分割精度,助力高效涨点【附源码+注释】
  • 告别硬编码:优雅管理状态常量与响应码
  • Ansible Facts变量
  • 相对论之光速
  • IP地址分配
  • Python 中用T = TypeVar(“T“)这个语法定义一个“类型变量”,属于类型提示系统的一部分
  • Java学习打卡-Day18-ArrayList、Vector、LinkedList
  • Ajax原理笔记
  • JDBC数据库连接池技术详解——从传统连接方式到高效连接管理
  • 零拷贝分析
  • LeetCode热题100JS(49/100)第九天|199|114|105|437|236
  • undo log ,redo log 和binlog的区别?
  • 使用 yum 命令安装 MariaDB 指南
  • 安卓edge://inspect 和 chrome://inspect调试移动设备上的网页
  • 瑞幸需要宇树科技
  • UNION,UNION ALL 的详细用法
  • 【leetcode hot 100 437】路径总和Ⅲ
  • Typora 使用教程(标题,段落,字体,列表,区块,代码,脚注,插入图片,表格,目录)
  • 什么是广播系统语言传输指数 STIPA
  • 国务院关税税则委:调整对原产于美国的进口商品加征关税措施
  • 回望乡土:对媒介化社会的反思
  • 人民日报钟声:通过平等对话协商解决分歧的重要一步
  • 铁路部门:确保沿线群众安全,焦柳铁路6个区段将陆续安装防护栅栏
  • 郑州通报“夜市摊贩收取香烟交给城管”:涉事人员停职调查
  • 习近平结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典回到北京