开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、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"。
解题思路:
题目要求对给定的字符串进行处理,当字符串中出现‘#’退格符号,前面就需要删除一个普通字符,最终判断处理完的字符是否相等,输出答案。
我一开始觉得是用集合或者数组,就写了很多个循环结构去处理,遇到 # 就把 # 以及 前面一个位置的元素删除,但是运行超时,时间复杂度实在让人大跌眼镜。
看了题解的思路之后,瞬间就开窍了。
我们完全可以巧妙地利用堆栈的结构,扫描字符串的每一个字符,正常的字符正常压入堆栈结构中。
当遇到退格符号 # 我们就让栈顶元素出栈,这样就达到了退格的效果,非常简单就得到了我们想要的效果。
最后我们怎么判断重构完成后的两个字符串是否相等呢?只需要使用equals()方法,就可以比较返回的两个堆栈结构是否相等了。
提交代码:
class Solution {
public boolean backspaceCompare(String s, String t) {
//比较最终获得的堆栈内容,两者相等返回true,否则返回false
return bulid(s).equals(bulid(t));
}
public Deque bulid(String str){ //建立重构字符串的方法
int len = str.length(); //获取传入字符串的长度
Deque<Character> dq = new LinkedList<>();//创建堆栈结构
for(int i = 0;i < len;++i){//遍历字符串字符
char ch = str.charAt(i);
if(ch != '#'){ //遍历到正常的字符
dq.push(ch); //入栈
}
else{ //遍历到‘#’退格字符
if(dq.size() > 0) //栈空就不需要操作了
dq.pop(); //栈顶元素出栈,达到推个效果
}
}
return dq; //返回存放重构后字符的堆栈结构
}
}
提交结果: