百度&必应权4, 日IP8000. 查看详情
自助收录

844.比较含退格的字符串(解法二:模拟栈)

算法刷题2年前 (2023)更新 江南白衣
353 0 0
844.比较含退格的字符串(解法二:模拟栈)

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”。
分析:这种匹配(消除)问题是栈擅长的题型,但是对于本题,没有必要使用栈,因为最后比较时还要比较栈里的元素,有点麻烦。本节我们直接使用字符串string作为栈,末尾添加和弹出,string(或StringBuilder)有相应的接口,最后比较的时候,只要比较两个字符串就可以了,这种方式比比较栈里的元素方便很多。
1、创建两个StringBuilder类ssb,tsb分别模拟两个栈,因为Java中String是不可变的,API提供的方法也少,转成增强类更方便一些。
2、循环遍历字符串s,t中的每个字符c,把它们压入栈中
3、如果字符不等于#,即if (c != ‘#’) ,字符入栈
4、如果字符等于#,并且ssb,tsb的长度大于0(即栈不为空),弹出最后一个元素,也就是栈顶元素(if else同时成立时,第一个条件满足后即跳出条件表达式
5、ssb,tsb转为String字符串进行比较

package com.codernav.demo.leetcode.array.removeelement;

/**
 * 844. 比较含退格的字符串(普通解法, 使用String模拟栈的思路)
 * 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
 * 注意:如果对空文本输入退格字符,文本继续为空。
 * 原文地址:https://www.codernav.com/2903.html
 * 更多算法详解:https://www.codernav.com
 */
public class Q_844_1 {
    public static void main(String[] args) {
        // 普通方式,模拟栈
        f("ab#c#d", "ad#c");
    }

    private static boolean f(String s, String t) {
        // 模拟栈
        StringBuilder ssb = new StringBuilder();
        StringBuilder tsb = new StringBuilder();
        for (char c : s.toCharArray()) {
            // if else同时成立时,第一个条件满足后即跳出条件表达式
            if (c != '#') {
                ssb.append(c); // 模拟入栈
            } else if (ssb.length() > 0) { // 栈非空才能弹栈
                ssb.deleteCharAt(ssb.length() - 1); // 模拟弹栈
            }
        }
        for (char c : t.toCharArray()) {
            if (c != '#') {
                tsb.append(c); // 模拟入栈
            } else if (tsb.length() > 0) { // 栈非空才能弹栈
                tsb.deleteCharAt(tsb.length() - 1); // 模拟弹栈
            }
        }

        return ssb.toString().equals(tsb.toString());

    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...