844. Backspace String Compare
一、问题描述
给定两个字符串 S
和 T
,每个字符串中均包含字符 '#'
表示退格键。需判断对两个字符串进行退格操作后,最终得到的字符串是否相等。
示例:
示例 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
进行遍历; - 遇到非
'#'
字符时,将其压入栈中; - 遇到
'#'
字符且栈不为空时,弹出栈顶元素,模拟退格操作; - 遍历结束后,将两个栈中的字符依次拼接成字符串;
- 比较最终得到的两个字符串是否相等,若相等则返回
true
,否则返回false
。
(二)代码实现
C# 代码
public class Solution
{
public bool BackspaceCompare(string S, string T)
{
return ParseString(S) == ParseString(T);
}
private string ParseString(string s)
{
var stack = new Stack<char>();
foreach (var c in s)
{
if (c == '#')
{
if (stack.Count > 0)
{
stack.Pop();
}
}
else
{
stack.Push(c);
}
}
// 将栈中的字符逆序拼接成字符串
return new string(stack.ToArray());
}
}
JavaScript 代码
/**
* @param {string} S
* @param {string} T
* @return {boolean}
*/
var backspaceCompare = function (S, T) {
return parseString(S) === parseString(T);
};
/**
* @param {string} s
* @return {string}
*/
var parseString = function (s) {
let stack = [];
for (let c of s) {
if (c == '#') {
if (stack.length > 0) {
stack.pop();
}
}
else {
stack.push(c);
}
}
return stack.reverse().join("");
}
(三)复杂度分析
- 时间复杂度:遍历两个字符串的时间复杂度为 O(m+n)O(m + n)O(m+n),其中 mmm 和 nnn 分别为字符串
S
和T
的长度。栈操作和字符串拼接的时间复杂度相对较小,可忽略不计,因此整体时间复杂度为 O(m+n)O(m + n)O(m+n)。 - 空间复杂度:在最坏情况下,两个字符串中均不存在
'#'
字符,此时栈中需要存储所有字符,空间复杂度为 O(m+n)O(m + n)O(m+n)。
上述基于栈的解法逻辑清晰,通过模拟退格操作的过程,高效地解决了比较含退格字符串的问题。