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) 将此字符串与指定的对象比较。

猜你喜欢

转载自blog.csdn.net/weixin_44998686/article/details/108564131