以《最大UCC子串计算》为例,解析AI刷题功能亮点 | 豆包MarsCode AI刷题

501 阅读5分钟

本次我将以《最大UCC子串计算》这道题为例,通过这篇文章来解析豆包MarsCode AI刷题的亮点所在;

题面如下:

image.png

看上去有些复杂,我们让豆包MarsCode AI帮我们解析一下题目:

image.png

image.png

image.png

可以看到豆包MarsCode AI给出了对于本道题非常详细的解析,包括关键点、解题思路、数据结构的选择和实现本题的算法步骤,解题思路中甚至包括两种不同的方法:动态规划和贪心策略,后面的算法步骤和代码框架采用了动态规划的方法;

那么我们根据豆包MarsCode AI给出的代码框架完成本题,先试着运行一下示例:

image.png

啊?😮有一个示例怎么出错了?看来现在的实现有些问题;不过别慌,我们先来看看是哪一个示例出错,并把输出打印出来:

image.png

看来是示例2出错了,程序输出1,而正确答案为2;

这时候如果觉得找出问题很困难时,就可以求助一下强大的豆包MarsCode AI了,让它根据出错的示例修改一下代码实现:

image.png

image.png

image.png

运行一下测试用例,结果还是在示例2出错了😢

看来豆包MarsCode AI的思路被之前的实现束缚住了,那我们就来手动分析一下豆包MarsCode AI的实现,帮它解困,给它一个新的思路;经过分析发现,豆包MarsCode AI的实现思路中的状态转移有些问题,它只考虑了当前一个字符,这样很容易出现漏掉转移条件的情况发生,于是我们给他规定新的转移条件:

image.png

此时可能还有没考虑到的转移条件,根据程序运行情况进行提示:

image.png

最终实现思路:

image.png

最终程序实现:

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);
    }
}

提交结果:

image.png

那么我们就愉快的通过本题了🤩

但是我们又想起来,最开始向豆包MarsCode AI询问解题思路的时候,它给了我们动态规划和贪心算法两种实现方法,这时候我们想挑战一下自己,再用贪心算法实现一遍;老规矩,如果没有思路的话,求助豆包MarsCode AI:

image.png

豆包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);
    }
}

成功通过本题:

image.png

本次我们通过《小U和字符'R'的喜好》这道题目的解决过程展示了豆包MarsCode AI刷题平台的几个显著亮点:

  1. 全面的解题策略推荐:针对同一题目,豆包MarsCode AI能提供多种解题思路,如本例中的动态规划和贪心算法。这不仅拓宽了用户的解题思路,也促进了对不同算法的理解和掌握。
  2. 详尽的算法步骤与代码框架:无论是哪种解题方法,豆包MarsCode AI都能给出具体的算法步骤说明以及初步的代码框架,减少了用户由零开始构建解决方案的时间成本。
  3. 针对性的调试辅助:当用户的实现出现问题时,AI能基于出错的示例给出具体的改进建议,帮助定位问题所在。即使AI提供的初始解决方案存在问题,也能通过用户的反馈进行调整,逐步接近正确的解法。
  4. 持续的互动和支持:在整个解题过程中,豆包MarsCode AI与用户的互动贯穿始终,无论是在初次寻求解题思路时,还是在遇到难题需要进一步指导时,AI都能提供及时的帮助和支持,形成了一个闭环的学习过程。

综上所述,豆包MarsCode AI刷题平台通过其全面的解题策略、详尽的算法指导、有效的调试辅助以及持续的互动和支持,为用户创造了一个高效、互动性强且充满乐趣的学习环境,特别适合希望提升编程能力和算法水平的学习者。

好了,那么我们这一次的解析就到这里,后面会给大家展示豆包MarsCode AI刷题的更多功能。