算法题-数组-844-比较含退格的字符串

123 阅读1分钟

844-比较含退格的字符串

题目描述

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

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

示例 1:

输入: s = "ab#c", t = "ad#c"
输出: true
解释: s 和 t 都会变成 "ac"

示例 2:

输入: s = "ab##", t = "c#d#"
输出: true
解释: s 和 t 都会变成 ""

示例 3:

输入: s = "a#c", t = "b"
输出: false
解释: s 会变成 "c",但 t 仍然是 "b"

分析

首先想到的是利用栈的思想完成,分别对 s 和 t 两个字符串进行处理后比较二者是否相同,返回 s==t 即可

题解

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    let l1 = s.split(''), l2 = t.split('');
    let ln1 = [], ln2 = [];
    l1.map(item=>{
        if(item!='#') {
            ln1.push(item)
        } else {
            ln1.pop()
        }
    })
    l2.map(item=>{
        if(item!='#') {
            ln2.push(item)
        } else {
            ln2.pop()
        }
    })
    s = ln1.join('');
    t = ln2.join('');
    return s==t;
};

分析

时间复杂度:O(m+n)

空间复杂度:O(m+n)

优化 - 双指针

从后向前双指针:同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。

如果S[i]和S[j]不相同返回false,如果有一个指针(i或者j)先走到的字符串头部位置,也返回false。

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    let sSkipNum = 0, tSkipNum = 0;
    let i = s.length - 1, j = t.length - 1;
    while(1) {
        while(i>=0) {
            if(s[i] == '#') {
                sSkipNum++;
            } else {
                if(sSkipNum>0) sSkipNum--;
                else break;
            }
            i--;
        }
        while(j>=0) {
            if(t[j] == '#') {
                tSkipNum++;
            } else {
                if(tSkipNum>0) tSkipNum--;
                else break;
            }
            j--;
        }
        if(i<0 || j<0) break;
        if(s[i] != t[j]) return false;
        i--;
        j--;
    }
    if(i==-1 && j==-1) return true;
    return false;
};

image.png