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()); } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...