这是我参与更文挑战的第12天,活动详情查看: 更文挑战
844. 比较含退格的字符串
题目描述
给定 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 = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。
示例 4:
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。
提示:
- 1 <= S.length <= 200
- 1 <= T.length <= 200
- S 和 T 只含有小写字母以及字符 '#'。
友情链接
思路解析
看完题目最初想到的就是用两个栈,分别存储两个字符串的字符。依次遍历字符串的字符时,非 “#” 字符就入栈,遇到 “#” 时,栈不为空时,就从顶部弹掉一个字符。
初始化栈数据之后,先判断两个栈大小是否相同。这是最直观的,如果大小都不相同,那么两个最终结果肯定是返回的 false 。
同时从两个栈的顶部弹出元素,如果两元素相同,继续弹出比较,一旦遇到不相同的,直接返回 false 。所有元素比较完毕后,就以为所有元素对应相同。也即程序返回 true 。
算法实现
class Solution {
public boolean backspaceCompare(String s, String t) {
LinkedList<Character> stack1=getTheStack(s);
LinkedList<Character> stack2=getTheStack(t);
if(stack1.size()!=stack2.size()){
return false;
}else{
while(!stack1.isEmpty()){
if(stack1.pop()!=stack2.pop()){
return false;
}
}
return true;
}
}
private LinkedList<Character> getTheStack(String str){
LinkedList<Character> stack=new LinkedList<>();
for(int i=0;i<str.length();i++){
char ch=str.charAt(i);
if('#'==ch){
if(!stack.isEmpty()){
stack.pop();
}
}else{
stack.push(ch);
}
}
return stack;
}
}