【一天一大 lee】比较含退格的字符串 (难度:简单) - Day20201019

20201019

题目:

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

注意: 如果对空文本输入退格字符,文本继续为空。

示例:

  1. 示例 1:
输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。
  1. 示例 2:
输入:S = "ab##", T = "c#d#"
输出:true
解释:S 和 T 都会变成 “”。
  1. 示例 3:
输入:S = "a##c", T = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。
  1. 示例 4:
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

提示:

  • 1 <= S.length <= 200
  • 1 <= T.length <= 200
  • S 和 T 只含有小写字母以及字符 ‘#’。

抛砖引玉

思路:

先不考虑复杂度问题

按照题意分别处理 S、T 两个字符

  • 遍历字符
  • 遇非#则将字符拼接到新字符串中
  • 遇到#删除新字符串最后一个字符

抛砖引玉

/**
 * @param {string} S
 * @param {string} T
 * @return {boolean}
 */
var backspaceCompare = function(S, T) {
  let s = '',
    t = '',
    slen = S.length,
    tlen = T.length
  // 处理S
  for (let i = 0; i < slen; i++) {
    if (S[i] === '#') {
      s = s.substring(0, s.length - 1)
    } else {
      s = s + S[i]
    }
  }
  // 处理T
  for (let i = 0; i < tlen; i++) {
    if (T[i] === '#') {
      t = t.substring(0, t.length - 1)
    } else {
      t = t + T[i]
    }
  }
  return s === t
}

双指针

声明两个指针分别对 T、S 从后向前比较:

  • 遇到#记录指针跳过次数+1
  • 遇到非#且跳过次数伪 0,比较两字符串指针上的字符是否相同
  • 如果不同直接返回 false
  • 如果比较到最后一直相同则默认返回 true
var backspaceCompare = function(S, T) {
  let sIndex = S.length - 1, // S指针
    tIndex = T.length - 1, // T指针
    skipS = 0, // S中需要跳过(删除)的字符数量
    skipT = 0 // T中需要跳过(删除)的字符数量

  while (sIndex >= 0 || tIndex >= 0) {
    // S非#且跳过次数伪 0
    while (sIndex >= 0) {
      if (S[sIndex] == '#') {
        skipS++
        sIndex--
      } else if (skipS > 0) {
        skipS--
        sIndex--
      } else {
        break
      }
    }
    // T非#且跳过次数伪 0
    while (tIndex >= 0) {
      if (T[tIndex] == '#') {
        skipT++
        tIndex--
      } else if (skipT > 0) {
        skipT--
        tIndex--
      } else {
        break
      }
    }
    // 比较对应位字符是否相同
    if (sIndex >= 0 && tIndex >= 0) {
      if (S[sIndex] != T[tIndex]) {
        return false
      }
    } else {
      if (sIndex >= 0 || tIndex >= 0) {
        return false
      }
    }
    sIndex--
    tIndex--
  }
  return true
}

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目
欢迎关注留言

公众号:前端小书童

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值