前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【一天一大 lee】比较含退格的字符串 (难度:简单) - Day20201019

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

作者头像
前端小书童
发布2020-11-03 10:11:59
发布2020-11-03 10:11:59
29500
代码可运行
举报
文章被收录于专栏:前端小书童前端小书童
运行总次数:0
代码可运行

20201019

题目:

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

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

示例:

  1. 示例 1:
代码语言:javascript
代码运行次数:0
运行
复制
输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。
  1. 示例 2:
代码语言:javascript
代码运行次数:0
运行
复制
输入:S = "ab##", T = "c#d#"
输出:true
解释:S 和 T 都会变成 “”。
  1. 示例 3:
代码语言:javascript
代码运行次数:0
运行
复制
输入:S = "a##c", T = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。
  1. 示例 4:
代码语言:javascript
代码运行次数:0
运行
复制
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

提示:

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

抛砖引玉

思路:

先不考虑复杂度问题

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

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

抛砖引玉

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * @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
代码语言:javascript
代码运行次数:0
运行
复制
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 栏目 欢迎关注留言

公众号:前端小书童

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目:
    • 示例:
  • 抛砖引玉
    • 双指针
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档