【LeetCode-简单题】844. 比较含退格的字符串

文章目录

    • 题目
    • 方法一:单指针
    • 方法二:双指针
    • 方法三:栈

题目

【LeetCode-简单题】844. 比较含退格的字符串_第1张图片

方法一:单指针

  1. 首先每次进入循环处理之前需要对第一个字符进行判断,若是退格符,直接删掉,结束此次循环
  2. fast从0开始,如果fast指向的字符不为# fast往后移动
  3. 如果fast指向的字符为 # 则删除 fast前面一个字符 和fast指向的字符 然后重置fast指针到起始点继续循环,直到没有#号符为止
  4. 在判断处理完的两个字符串是否相等
// 方法一 : 单指针
    public boolean backspaceCompare(String s, String t) {
        return letter(s).equals(letter(t));

    }

    public String letter(String s){
      StringBuffer str = new StringBuffer(s);
      int fast = 0;
      while(fast< str.length()){
          if(str.charAt(0) == '#') { // 若字符首个字符为 ‘#’直接删除 结束本次循环
            str = str.delete(0,1);
            continue;
          }  
          if(str.charAt(fast) != '#') fast++;//如果fast指向的字符不为#  fast往后移动
          else{//如果fast指向的字符为  #  则删除 fast前面一个字符  和fast字符   然后重置fast指针到起始点
              str = str.delete(fast-1,fast+1);//注意  这里删除区间元素 是 左闭右开的 要删除 left ,right 区间的元素  delete(left,right+1)
              fast = 0;//重置fast
          }
      }
      return str.toString();//返回处理好的字符串
    }

方法二:双指针

  1. 定义一个尾部指针,和#号计数器
  2. 如果尾部指针遇到# ,删除#号同时 让#号计数器+1
  3. 如果遇到字符,根据#计数器的数量来删除字符,每遇到一个字符,如果#号计数器大于0,则直接删除字符。
  4. 若遇到字符时,#号计数器=0,说明之前没有退格符,则尾部指针直接往前移动
  5. 直到尾部指针<0,代表处理完成
// 方法二 : 双指针 本质还是单指针  指针从字符串尾部向前移动,一旦遇到#  记录退格的数量 遇到字符就根据退格数量删除字符,直到指针<0
    public boolean backspaceCompare(String s, String t) {
        return letter(s).equals(letter(t));

    }

    public String letter(String s){
      StringBuffer str = new StringBuffer(s);
      int end = str.length()-1;//将指针指向末尾
      int temp = 0;//记录#号的数量
      while(end >= 0){
          if(str.charAt(end)=='#') {//遇到#号  temp+1,同时删除#号
              temp++;
              str.delete(end,end+1);
            
          }else{//遇到非#号  判断#数量来删除尾部字符
              if(temp > 0){
              str.delete(end,end+1);
              temp--;//更新#号数量
           }
          }
           end--;//尾部指针向前移动
      }
      return str.toString();//返回处理好的字符串
    }

方法三:栈

你可能感兴趣的:(力扣,#,简单题,leetcode,算法,职场和发展)