本次我将以《最大UCC子串计算》这道题为例,通过这篇文章来解析豆包MarsCode AI刷题的亮点所在;
题面如下:
看上去有些复杂,我们让豆包MarsCode AI帮我们解析一下题目:
可以看到豆包MarsCode AI给出了对于本道题非常详细的解析,包括关键点、解题思路、数据结构的选择和实现本题的算法步骤,解题思路中甚至包括两种不同的方法:动态规划和贪心策略,后面的算法步骤和代码框架采用了动态规划的方法;
那么我们根据豆包MarsCode AI给出的代码框架完成本题,先试着运行一下示例:
啊?😮有一个示例怎么出错了?看来现在的实现有些问题;不过别慌,我们先来看看是哪一个示例出错,并把输出打印出来:
看来是示例2出错了,程序输出1,而正确答案为2;
这时候如果觉得找出问题很困难时,就可以求助一下强大的豆包MarsCode AI了,让它根据出错的示例修改一下代码实现:
运行一下测试用例,结果还是在示例2出错了😢
看来豆包MarsCode AI的思路被之前的实现束缚住了,那我们就来手动分析一下豆包MarsCode AI的实现,帮它解困,给它一个新的思路;经过分析发现,豆包MarsCode AI的实现思路中的状态转移有些问题,它只考虑了当前一个字符,这样很容易出现漏掉转移条件的情况发生,于是我们给他规定新的转移条件:
此时可能还有没考虑到的转移条件,根据程序运行情况进行提示:
最终实现思路:
最终程序实现:
public class Main {
public static int solution(int m, String s) {
int n = s.length();
int[][] dp = new int[n + 1][m + 1];
// 初始化 dp 数组
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
dp[i][j] = 0;
}
}
// 状态转移
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
// 考虑当前字符为 'U' 或 'C' 的情况
if (s.charAt(i - 1) == 'U') {
// 尝试在后面插入 "CC"
if (j >= 2) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 2] + 1);
}
} else if (s.charAt(i - 1) == 'C') {
// 尝试在前面插入 'U' 和在后面插入 'C'
if (j >= 2) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 2] + 1);
}
// 尝试在前面插入 "UC"
if (j >= 2) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 2] + 1);
}
}
// 考虑前面两个或三个字符的情况
if (i >= 2) {
if (s.charAt(i - 2) == 'U' && s.charAt(i - 1) == 'C') {
// 尝试在后面插入 'C'
if (j >= 1) {
dp[i][j] = Math.max(dp[i][j], dp[i - 2][j - 1] + 1);
}
}
}
// 考虑前面两个字符为 "CC" 的情况
if (i >= 2) {
if (s.charAt(i - 2) == 'C' && s.charAt(i - 1) == 'C') {
// 尝试在前面插入 'U'
if (j >= 1) {
dp[i][j] = Math.max(dp[i][j], dp[i - 2][j - 1] + 1);
}
}
}
if (i >= 3) {
if (s.charAt(i - 3) == 'U' && s.charAt(i - 2) == 'C' && s.charAt(i - 1) == 'C') {
// 不需要再插入 'C',直接继承前面的状态
dp[i][j] = Math.max(dp[i][j], dp[i - 3][j] + 1);
}
}
// 考虑删除或替换操作
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j]);
}
}
// 计算最终结果
int maxCount = 0;
for (int j = 0; j <= m; j++) {
maxCount = Math.max(maxCount, dp[n][j] + (m - j) / 3);
}
return maxCount;
}
public static void main(String[] args) {
System.out.println(solution(3, "UCUUCCCCC") == 3);
System.out.println(solution(6, "U") == 2);
System.out.println(solution(2, "UCCUUU") == 2);
System.out.println(solution(10, "CCU") == 4);
System.out.println(solution(7, "CCUUUCUCU") == 5);
}
}
提交结果:
那么我们就愉快的通过本题了🤩
但是我们又想起来,最开始向豆包MarsCode AI询问解题思路的时候,它给了我们动态规划和贪心算法两种实现方法,这时候我们想挑战一下自己,再用贪心算法实现一遍;老规矩,如果没有思路的话,求助豆包MarsCode AI:
豆包MarsCode AI给出的思路非常详细,那么我们就来自己实现一遍:
import java.util.Arrays;
public class Main {
public static int solution(int m, String s) {
// write code here
int n = s.length();
boolean[] vis = new boolean[n];
Arrays.fill(vis, false);
int ret = 0;
int pos = 0;
while (m >= 0 && pos + 2 < n) {
if (s.charAt(pos) == 'U' && s.charAt(pos + 1) == 'C' && s.charAt(pos + 2) == 'C') {
ret++;
vis[pos] = vis[pos + 1] = vis[pos + 2] = true;
pos += 3;
} else {
pos++;
}
}
pos = 0;
while (m > 0 && pos + 1 < n) {
if (vis[pos] || vis[pos + 1]) {
pos++;
continue;
}
if (s.charAt(pos) == 'U' && s.charAt(pos + 1) == 'C') {
ret++;
m--;
vis[pos] = vis[pos + 1] = true;
pos += 2;
} else {
pos++;
}
}
pos = n - 1;
while (m > 0 && pos - 1 >= 0) {
if (vis[pos] || vis[pos - 1]) {
pos--;
continue;
}
if (s.charAt(pos) == 'C' && s.charAt(pos - 1) == 'C') {
ret++;
m--;
vis[pos] = vis[pos - 1] = true;
pos -= 2;
} else {
pos--;
}
}
pos = 0;
while (m >= 2 && pos < n) {
if (vis[pos]) {
pos++;
} else {
m -= 2;
ret++;
pos++;
}
}
ret += m / 3;
return ret;
}
public static void main(String[] args) {
System.out.println(solution(3, "UCUUCCCCC") == 3);
System.out.println(solution(6, "U") == 2);
System.out.println(solution(2, "UCCUUU") == 2);
}
}
成功通过本题:
本次我们通过《小U和字符'R'的喜好》这道题目的解决过程展示了豆包MarsCode AI刷题平台的几个显著亮点:
- 全面的解题策略推荐:针对同一题目,豆包MarsCode AI能提供多种解题思路,如本例中的动态规划和贪心算法。这不仅拓宽了用户的解题思路,也促进了对不同算法的理解和掌握。
- 详尽的算法步骤与代码框架:无论是哪种解题方法,豆包MarsCode AI都能给出具体的算法步骤说明以及初步的代码框架,减少了用户由零开始构建解决方案的时间成本。
- 针对性的调试辅助:当用户的实现出现问题时,AI能基于出错的示例给出具体的改进建议,帮助定位问题所在。即使AI提供的初始解决方案存在问题,也能通过用户的反馈进行调整,逐步接近正确的解法。
- 持续的互动和支持:在整个解题过程中,豆包MarsCode AI与用户的互动贯穿始终,无论是在初次寻求解题思路时,还是在遇到难题需要进一步指导时,AI都能提供及时的帮助和支持,形成了一个闭环的学习过程。
综上所述,豆包MarsCode AI刷题平台通过其全面的解题策略、详尽的算法指导、有效的调试辅助以及持续的互动和支持,为用户创造了一个高效、互动性强且充满乐趣的学习环境,特别适合希望提升编程能力和算法水平的学习者。
好了,那么我们这一次的解析就到这里,后面会给大家展示豆包MarsCode AI刷题的更多功能。