477.相邻重复字母删除问题
问题描述
小M拿到了一个由小写字母组成的字符串 s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在 s 上反复进行此操作,直到无法再删除任何字母。
请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。
解题思路
数据结构选择
我们可以使用栈(Stack)来解决这个问题。栈的特点是后进先出(LIFO),非常适合处理相邻元素的删除操作。
算法步骤
-
初始化一个栈:用于存储字符。
-
遍历字符串中的每个字符:
- 如果栈不为空且栈顶元素与当前字符相同,则弹出栈顶元素(即删除相邻的相同字符)。
- 否则,将当前字符压入栈中。
-
构建最终结果字符串:将栈中的字符按顺序取出,形成最终的字符串。
代码
import java.util.*;
public class Main {
public static String solution(String s) {
// write code here
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (!stack.isEmpty() && stack.peek() == c) {
stack.pop(); // 删除栈顶元素
} else {
stack.push(c); // 将当前字符压入栈中
}
}
// 构建最终结果字符串
StringBuilder result = new StringBuilder();
for (char c : stack) {
result.append(c);
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(solution("abbaca").equals("ca"));
System.out.println(solution("azxxzy").equals("ay"));
System.out.println(solution("a").equals("a"));
}
}
446.最大化数组和的问题
### 问题描述
小F得到了一个长度为 N 的数组 A,其中每个元素都是偶数,且数组编号从 0 到 N-1。请注意,数组 A 中的整数可以是负数。
你需要执行 N 个任务,编号从 0 到 N-1。在任务 i 中,你可以选择将 A[i] 乘以 2 或将 A[i] 除以 2。
你的任务是通过执行这些操作后,使数组 A 的元素和达到最大值,并返回这个最大和。
解题思路
-
初始化总和:首先,计算数组
A的初始总和。 -
遍历数组:对于每个元素
A[i]:- 如果
A[i]是正数,考虑将其乘以2是否能增加总和。 - 如果
A[i]是负数,考虑将其除以2是否能增加总和。
- 如果
-
选择最优操作:对于每个元素,选择能使总和增加最多的操作。
-
返回最大总和:在遍历完所有元素后,返回最终的总和。
数据结构与算法
- 数据结构:使用数组
A来存储输入数据。 - 算法:遍历数组,对每个元素进行操作,选择最优操作,更新总和。
感想
栈这种数据结构的 “后进先出” 特性在解题过程中得到了充分体现。每一道题都像是一个待解的谜题,利用栈的特性去巧妙地处理数据顺序是解题的关键。例如在括号匹配问题中,栈就像是一个严格的检查员,通过不断地压入和弹出操作来判断括号是否匹配。 其次,栈在处理递归问题转化为迭代问题时发挥了重要作用。它能够模拟函数调用栈,帮助我们更高效地解决问题。在解决一些复杂的路径搜索或者表达式求值问题时,栈提供了一种简洁而有效的思路。 然而,在解题过程中也遇到了不少挑战。有时会因为没有正确地把握数据进出栈的时机,导致结果错误。这让我明白,对栈的操作必须精准且有条理。