public class Main {
public static int solution(String s) {
int balance = 0;
int insertions = 0;
for (char c : s.toCharArray()) {
if (c == '(') {
balance++;
} else if (c == ')') {
balance--;
}
if (balance < 0) {
insertions++;
balance = 0;
}
}
// If balance is positive, it means we have extra '(' that need to be balanced
insertions += balance;
return insertions;
}
public static void main(String[] args) {
System.out.println(solution("()") == 0);
System.out.println(solution("(((") == 3);
System.out.println(solution("()") == 0);
System.out.println(solution("()))((") == 4);
}
}
一、题目解析
-
思路:
- 这段代码主要用于计算使给定字符串中的括号平衡所需的最少插入次数。它通过遍历字符串中的每个字符,遇到
(时将平衡计数器balance加 1,遇到)时减 1。如果在遍历过程中balance小于 0,说明当前有多余的),需要插入一个(来平衡,此时插入次数insertions加 1 并将balance重置为 0。遍历完字符串后,如果balance仍大于 0,说明有多余的(,需要插入相同数量的)来平衡,所以将balance加到insertions上。
- 这段代码主要用于计算使给定字符串中的括号平衡所需的最少插入次数。它通过遍历字符串中的每个字符,遇到
-
代码详解:
-
int balance = 0;和int insertions = 0;:分别初始化平衡计数器和插入次数计数器。 -
for (char c : s.toCharArray()):遍历输入字符串s的每个字符。 -
内部的
if-else语句根据字符是(还是)来更新balance的值。 -
当
balance < 0时,执行insertions++; balance = 0;,处理多余)的情况。 -
最后
insertions += balance;处理多余(的情况并得到最终的插入次数。
-
二、知识总结
-
知识点:
- 字符串遍历:通过
toCharArray()方法将字符串转换为字符数组,然后使用增强的for循环遍历字符数组中的每个字符。 - 计数器的使用:利用
balance和insertions两个变量分别记录括号的平衡状态和所需的插入次数,这种计数技巧在处理类似的序列匹配或平衡问题中经常使用。
- 字符串遍历:通过
-
理解:
- 理解
balance变量的变化是关键。它就像一个天平,(使其倾向正方向,)使其倾向负方向,当负方向失衡时就需要插入(来调整,而最后如果正方向有剩余则需要插入)来完全平衡。
- 理解
-
学习建议:
-
对于入门同学,首先要熟练掌握字符串的基本操作,如遍历、获取字符等。多做一些类似的序列处理题目,加深对计数器使用的理解,学会根据不同的条件来更新计数器的值,并且要仔细分析边界情况,比如本题中
balance为 0 或负数时的处理逻辑。
-
三、学习计划
-
制定刷题计划:
- 可以按照数据结构和算法的类别来划分刷题阶段,例如先集中刷字符串处理相关的题目,然后再进行数组、链表等。每天安排一定的时间,比如 1 - 2 小时,从简单题目开始,逐步增加难度。例如,第一天可以先做 3 - 5 道简单的字符串处理题目,包括本题这种括号匹配类的,理解基本概念和方法。第二天可以尝试稍微复杂一点的字符串变换题目等。
-
利用错题进行针对性学习:
-
当遇到错题时,不要急于看答案。先自己重新分析代码,找出错误的原因,比如是逻辑错误、语法错误还是对题目理解有误。对于本题,如果计算出的插入次数错误,要检查
balance的更新逻辑和插入操作是否正确。将错题整理到错题本中,注明错误原因和正确的解题思路,定期回顾错题本,重新做错题,直到完全掌握。
-
四、工具运用
-
与其他学习资源结合:
- 除了使用刷题平台的 AI 功能外,可以结合在线教程学习。例如,在学习字符串处理时,可以先在网上搜索相关的字符串处理教程,了解基本的字符串函数和操作方法,然后再在刷题平台上实践。还可以参考一些经典的编程书籍,书中往往有更深入的理论讲解和更多的示例代码。比如在学习数据结构和算法时,《数据结构与算法分析:C++ 描述》这本书就很不错。可以将书中的知识和刷题过程中的经验相互印证,加深理解。另外,可以加入一些编程学习社区,在社区中与其他学习者交流刷题经验和遇到的问题,也可以从他人的解题思路中获得启发。