青训营X豆包MarsCode 技术训练营| 豆包MarsCode AI 刷题

43 阅读2分钟

题目内容:小D的 abc 变换问题

小D拿到了一个仅由 "abc" 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换:

  • 将 'a' 变成 'bc'
  • 将 'b' 变成 'ca'
  • 将 'c' 变成 'ab' 小D将重复该操作 k 次。你的任务是输出经过 k 次变换后,得到的最终字符串。 例如:对于初始字符串 "abc",执行 2 次操作后,字符串将变为 "caababbcbcca"

测试样例

样例1:

输入:s = "abc", k = 2
输出:'caababbcbcca'

样例2:

输入:s = "abca", k = 3
输出:'abbcbccabccacaabcaababbcabbcbcca'

样例3:

输入:s = "cba", k = 1
输出:'abcabc'

题目解析:

  • 将 'a' 变成 'bc'
  • 将 'b' 变成 'ca'
  • 将 'c' 变成 'ab'

因为替换规则是固定的,自然而然想到用匹配字符串中字符模式来做,而正则表达式是一种用于匹配字符串中字符模式的强大工具,可以通过 java.util.regex 包中的 Pattern 和 Matcher 类来使用。

代码实现

    public static String solution(String s, int k) {
        String regex = "[abc]"; // 匹配 'a', 'b', 'c'
        Pattern pattern = Pattern.compile(regex);
        for (; k > 0; k--) {
            StringBuffer sb = new StringBuffer();
            Matcher matcher = pattern.matcher(s);
            while (matcher.find()) {
                char ch = matcher.group().charAt(0);
                String replacement = getReplacement(ch);
                matcher.appendReplacement(sb, replacement);
            }
            matcher.appendTail(sb);
            s = sb.toString(); 
        }
        return s;
    }

    private static String getReplacement(char ch) {
        switch (ch) {
            case 'a': return "bc";
            case 'b': return "ca";
            case 'c': return "ab";
            default: return String.valueOf(ch);
        }
    }

知识总结:

因为对正则表达式配合MatcherPattern的用法不是特别熟悉,所以去搜集了以下资料去加深印象。

1.Matcher类的构造方法不是公开的,所以程序员不能直接通过new关键字创建它的对象。创建Matcher类对象需要调用Pattern对象的matcher()方法来完成。

2.Pattern 类用于编译正则表达式。编译后的 Pattern 对象可以用于创建 Matcher 对象,以在字符串中查找匹配项。

3.Matcher 类用于在输入字符串中查找与 Pattern 匹配的子字符串。它提供了多种方法来执行匹配操作和替换操作。

image.png Matcher类的这些替换方法中,appendReplacement()方法也需要先调用find()方法找到一个匹配项,然后才能执行

4.find 方法用于查找输入字符串中与正则表达式匹配的下一个子字符串。

5.appendReplacement 方法用于将匹配的子字符串替换为指定的替换字符串,并将结果追加到 StringBuffer 对象中。

6.appendTail 方法用于将最后一个匹配项之后的剩余部分追加到 StringBuffer 对象中。

7.StringBuffer 类用于在字符串上进行可变的操作。它提供了线程安全的方法来修改字符串内容。