首页 > 其他分享 >小D的abc变换问题-动态规划或者递归

小D的abc变换问题-动态规划或者递归

时间:2024-11-10 13:19:18浏览次数:3  
标签:abc string 递归 变换 样例 transform result 字符串

问题描述

小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'

 

解题思路

  1. 直接模拟

    • 你可以直接按照题目描述的规则,对字符串进行 k 次变换。每次变换时,遍历字符串中的每个字符,根据规则生成新的字符串。
    • 这种方法简单直接,但可能会因为字符串长度指数级增长而导致效率问题。
  2. 观察规律

    • 观察每次变换后的字符串,看看是否存在某种规律。例如,是否存在周期性,或者是否可以通过某种数学方法简化计算。
    • 如果存在周期性,你可以通过找到周期来减少计算次数。
  3. 递归或动态规划

    • 你可以考虑使用递归或动态规划来解决问题。例如,定义一个函数 transform(s, k),表示对字符串 s 进行 k 次变换后的结果。
    • 递归关系可以表示为 transform(s, k) = transform(transform(s, 1), k-1)

数据结构选择

  • 由于字符串长度可能会变得非常长,选择合适的数据结构来存储和处理字符串是关键。
  • 你可以使用 std::string 来存储字符串,并使用 std::string 的拼接操作来生成新的字符串。

算法步骤

  1. 初始化

    • 从输入字符串 s 开始。
  2. 循环变换

    • 对字符串进行 k 次变换,每次变换时根据规则生成新的字符串。
  3. 返回结果

    • 返回经过 k 次变换后的字符串。

代码实现:

#include <iostream>
#include <string>
using namespace std;

string transform(string s) {
    string result = "";
    for (char c : s) {
        if (c == 'a') {
            result += "bc";
        } else if (c == 'b') {
            result += "ca";
        } else if (c == 'c') {
            result += "ab";
        }
    }
    return result;
}

string solution(string s, int k) {
    // 初始化结果为输入字符串
    string result = s;
    
    // 进行 k 次变换
    for (int i = 0; i < k; ++i) {
        result = transform(result);
    }
    
    return result;
}

int main() {
    cout << (solution("abc", 2) == "caababbcbcca") << endl;
    cout << (solution("abca", 3) == "abbcbccabccacaabcaababbcabbcbcca") << endl;
    cout << (solution("cba", 1) == "abcabc") << endl;
    return 0;
}

标签:abc,string,递归,变换,样例,transform,result,字符串
From: https://blog.csdn.net/2301_78353179/article/details/143647959

相关文章

  • 过河卒,代码实现(递归算法)
    题目【输入形式】      输入一行4个整数,分别表示B点的坐标(n,m)以及对方马的坐标(X,Y)【输出形式】      输出一个整数,表示路径的条数【样例输入】6632【样例输出】171.思路类似经典的爬楼梯问题(n级台阶,每次能走一个台阶或者两个台阶,求走到n的不同顺序......
  • 题解:[ABC379D] Home Garden
    [ABC379D]HomeGarden题意:开始有一个空集,有\(Q\)次操作,每次有标识数\(op\):若\(op\)为\(1\):为集合添加一个元素\(0\)。若\(op\)为\(2\):输入\(T\),为集合内所有元素增加\(T\)。若\(op\)为\(3\):输入\(H\),删除集合内不小于\(H\)的元素,并输出删除元素个数。......
  • 题解:AT_abc379_e [ABC379E] E - Sum of All Substrings
    很水的一道题。我们先把题目上各地的数字看成一个序列,然后考虑计算该序列分别会对答案的每一位产生多少贡献。具体的,我们从后往前考虑答案的每一位。通过简单推演可知,设你当前考虑到答案的第\(i\)个数字,那么原序列对这一位的贡献为\(\sum_{j=1}^{n-i+1}a_j\timesj\)。这个......
  • 题解:AT_abc379_d [ABC379D] Home Garden
    难度严格小于C题。你考虑每盆花被种植的时间一定单调不降,这启示我们去用二分。具体的,我们用一个数组\(a\)表示当前所有的花的种植时间,并记录一个当前时间\(t\)。对于每个1操作都在数组后面加上个元素\(t\),对于\(2\)操作让\(t\leftarrowt+T\)。对于操作3,能够摘取的......
  • 将给定的表达式树(二叉链表存储)转换为等价的中缀表达式(递归)
    3765.表达式树可以拿这题验证自己的代码对不对ps:这里不是这题的答案,参照代码思路写即可voidBtreeToe(Btree*root){ BtreeToExp(root,1);//根的高度为1 }voidBtreeToExp(Btree*root,intdep){ if(root==NULL)return;//如果是空结点返回 elseif(!root->lef......
  • AT_abc379_g
    过于一眼的轮廓线dp。兼纪念abc首场无伤AK。首先我们可以经过缜密的计算的得到矩形的宽不超过\(14\)。然后现在你有\(4\)个数(边界视作\(0\))。不难想到\(4\)进制状压轮廓线dp。轮廓线dp状压dp的一种,轮廓线是分隔已处理部分与未处理部分的线。在本题中,轮廓线......
  • [ABC365C] Transportation Expenses
    [ABC365C]TransportationExpenses题面翻译【题目描述】有NNN个人参加某项活动,第ii......
  • C++ 可变参数模板递归展开
    #include<iostream>usingnamespacestd;template<typenameHead,typename...Tail>doubleMax(Headfirst,Tail...rest){doubleMaxnum=0;Maxnum=Max(rest...);if(Maxnum<first)Maxnum=first;returnMaxnum;}......
  • 用C语言实现汉诺塔问题(第四天:函数递归)【每天进步一点点-小白学习笔记】
    0 前言        最近比较忙,到现在才有时间更新博客,这两天刚好学到了函数递归,这是个很有趣的知识,为什么说有趣呢?因为递归这个东西吧,很多人都对它又爱又恨。爱在递归不仅可以轻松简化代码,增加可读性,还能将一些很难解决的算法问题轻松解决,但它又大大加大了程序复杂度,既......
  • 【老生谈算法】matlab实现可变指数遗忘的扩展递归最小二乘法(VEX-RLS)——递归最小二乘
    MATLAB实现可变指数遗忘的扩展递归最小二乘法(VEX-RLS)1、文档下载:本算法完整讲解和全套实现源码见下资源,有需要的朋友可以点击进行下载说明文档(点击下载)本算法文档【老生谈算法】Matlab实现可变指数遗忘的扩展递归最小二乘法(VEX-RLS)及其应用更多matlab算法原理及源码详......