首页 > 其他分享 >Leetcode 844 -- 双指针&&O(1)时间复杂度

Leetcode 844 -- 双指针&&O(1)时间复杂度

时间:2022-10-12 17:33:05浏览次数:92  
标签:字符 844 -- 复杂度 else 退格符 遍历 &&

题目描述

比较含退格的字符串

思路

这里主要考虑 O(1) 空间复杂度的做法。
一个字符是否会被删掉,只取决于该字符后面的退格符,而与该字符前面的退格符无关。因此当我们逆序地遍历字符串,就可以立即确定当前字符是否会被删掉。
只要能看出来倒序,就解决了一半了,剩下的主要是如何用代码实现。
有很多细节,详细看代码注释。
官方题解

代码

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int n = s.size(), m = t.size();
        int skips = 0, skipt = 0; // 标识跳过的字符个数
        int i, j;
        
        // 为什么for循环中的判断要用 i>=0||j>=0 而不是 i>=0&&j>=0呢?
        // 考虑一种边界情况:在for循环中,i遍历到了第1个字符,j遍历到了第0个字符,它们相等,继续下一次循环
        // 再经过 i--, j -- 之后,i=0,j=-1
        // 可以发现j已经不符合条件了,for结束,最后返回true
        // 但很明显,i还没遍历完啊
        
        // 不过!不要想当然的以为此时就不匹配了!
        // 因为i剩下的字符可能全都被退格!此时返回true
        // 也有可能最终剩下几个字符无法匹配,此时返回false

        
        for(i = n - 1, j = m - 1; i >= 0 || j >= 0; i -- , j -- ) 
        {
            // 因为在这个for循环内部,每一次我们都要比较s和t没被删除的字符是否相等
            // 所以我们要找到s和t中不为'#'的字符
            while(i >= 0) {
                if(s[i] == '#') // 是退格符
                {
                    skips ++ , i -- ; // i -- 继续往下找
                }
                else if(skips)
                {
                    skips -- , i -- ; // 虽然不是退格符,但是由于需要回退,所以这个字符要被删除,且继续往下找
                }
                else // 不需要回退 
                {
                    break;
                }
            }
            
            while(j >= 0) {
                if(t[j] == '#')
                {
                    skipt ++ , j -- ;
                }
                else if(skipt)
                {
                    skipt -- , j -- ;
                }
                else 
                {
                    break;
                }
            }
            
            if(i >= 0 && j >= 0) {
                if(s[i] != t[j])    return false;
            }
            else  {
                if(i >= 0 || j >= 0) // 说明一个字符串遍历完了,另一个字符串还没遍历完,肯定不相等
                    return false;
            }
        }
        
        // for done
        return true;
    }
};

标签:字符,844,--,复杂度,else,退格符,遍历,&&
From: https://www.cnblogs.com/ALaterStart/p/16785343.html

相关文章

  • VS102-416型振弦传感器无线数据采集仪
    VS102-416型振弦传感器无线数据采集仪是结合多年的项目实际使用,安装方便、实用性强、性能稳定、数据远传、成本低廉的振弦型数据采集仪产品。VS102-416型振弦传感器无线采集......
  • FREE给了岚图第一颗糖 甜度似乎并不持久
    文丨熔财经作者|张子健在中国新能源汽车市场里,除了一众造车新势力之外,还有许多传统国企在奋力不被落下,东风旗下的岚图便是其中之一。截至目前,岚图FREE交出了205天突破1万辆,4......
  • [caffe解读] caffe从数学公式到代码实现3-shape相关类
    接着上一篇说,本篇开始读layers下面的一些与blobshape有关的layer,比如flatten_layer.cpp等,具体包括的在下面;flatten_layer.cppconv与deconv虽然也与shape有关,但是由于比较复......
  • [caffe解读] caffe从数学公式到代码实现1-导论
    新板块说明今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助。作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框......
  • [caffe解读] caffe从数学公式到代码实现2-基础函数类
    接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp。absval_layer.cpp其中,下面这些layer是不需要反向传播的,大部分都是io类,我们就不讲了,自己去看。thres......
  • 【行业进展】谷歌4大AI黑科技部门,你可知
    李毅吉林大学计算机视觉方向作者|李毅编辑|言有三作为科技界的执牛耳者,谷歌在人工智能领域的实力有目共睹,本文将介绍谷歌AI黑科技产品背后的神秘部门。01DeepMind细数......
  • 文件下载 数据流方法
    1/**2*getblob下载文件方法3*@param{Number}time4*@return{String}5*@returns{Object}{time:Number,unit:any}6*/7exportfunct......
  • CAP原理
    架构类型1.AP架构当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。结论:违背了一致性C的要求,只满足可用性和分区容错,即AP2.CP架构CP架构当网络......
  • 判断map集合是否为空和是否为null
    转:判断map集合是否为空和是否为null    ......
  • 随机颜色
    1/**2*随机颜色3*@param:colorMap{颜色:true}生成不在该数据内的color4*/5exportconstgetRgbColorRandom=(colorMap={},transparency=0.......