LeetCode.844比较含退格的字符串(Java暴力+栈)

本文探讨了在处理包含退格字符的字符串时,如何高效地比较两个字符串是否相等。介绍了使用动态数组和栈两种数据结构实现的方法,以及如何优化代码。

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。

一开始没有理解什么是退格,呜呜呜!!!
而且做这道题之前我没有仔细考虑,我应该先思考用什么数据结构能比较高效的解决问题,我一来就是很暴力的做法,也就是我的笨办法。花的时间多,bug也多,一点一点的调试出来了,就感觉很亏,呜呜呜!!!

解法一:暴力

思路:设两个动态数组list 和list2,一个负责字符串S,一个负责T。
先将字符串的元素复制一份给动态数组,然后循环遍历去找“#”号,然后根据它所处的位置来进行操作。
细节:如果“#”在第一位,或者很多个“#”相连在一起,那么考虑在上面的操作完之后,进行“#”的清除。

public boolean backspaceCompare(String S, String T) {
	ArrayList<Character> list = new ArrayList<>();
	ArrayList<Character> list2 = new ArrayList<>();
	for (int i = 0; i < S.length(); i++) {
		list.add(S.charAt(i));
	}
	for (int i = 0; i < list.size(); i++) {
		if (list.get(i) == '#' && i != 0) {
			list.remove(i);
			list.remove(i - 1);
			i = -1;
		}
	}
	for (int i = 0; i < T.length(); i++) {
		list2.add(T.charAt(i));
	}
	for (int i = 0; i < list2.size(); i++) {
		if (list2.get(i) == '#' && i != 0) {
			list2.remove(i);
			list2.remove(i - 1);
			i = -1;
		}
	}
	for (int i = 0; i < list.size(); i++) {
		if (list.get(i) == '#') {
			list.remove(i);
		}
	}
	for (int i = 0; i < list2.size(); i++) {
		if (list2.get(i) == '#') {
			list2.remove(i);
		}
	}
	return list.equals(list2);
}

解法二:Stack

"#"号及其前面的符号都不能存入栈

public boolean backspaceCompare2(String S, String T) {
		Stack<Character> stackS = new Stack<>();
		Stack<Character> stackT = new Stack<>();
		for (int i = 0; i < S.length(); i++) {
			if (S.charAt(i) != '#') {
				stackS.add(S.charAt(i));
			} else if (!stackS.isEmpty()) {
				stackS.pop();
			}
		}
		for (int i = 0; i < T.length(); i++) {
			if (T.charAt(i) != '#') {
				stackT.add(T.charAt(i));
			} else if (!stackT.isEmpty()) {
				stackT.pop();
			}
		}
		return stackS.equals(stackT);
	}

这里可以进行优化一下:将重复的部分写在一个函数里面,调用函数

public boolean backspaceCompare3(String S, String T) {
		return compare(S).equals(compare(T));
	}
public String compare(String S) {
	Stack<Character> stack = new Stack<>();
	for (char c : S.toCharArray()) {
		if (c != '#') {
			stack.add(c);
		} else if (!stack.isEmpty()) {
			stack.pop();
		}
	}
	return String.valueOf(stack);
}

补充两个函数:

1.static String valueOf(Object obj) 返回的 Object参数的字符串表示形式。
2. boolean equals(Object anObject) 将此字符串与指定的对象比较。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值