首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务 他喜欢 R 字符,因为在某些任务中,这个字符通常表示

2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务

他喜欢 R 字符,因为在某些任务中,这个字符通常表示“正确”的结果

另一方面,他不喜欢 B 字符,因为在某些任务中,这个字符通常表示“错误”的结果

为了解决他的任务,塔子哥定义了字符串的权值为字符串中 R 字符的出现次数

例如,对于字符串 BBRBRB,它的权值为 2,因为其中有 2 个 R 字符

现在,塔子哥面临一个问题,他有一个长度为 n 的字符串 s,它仅由 R 和 B 组成

他想知道,长度为 n 的仅由 R 和 B组成的字符串中,

字典序不小于 s 的字符串的权值之和是多少?

因此,他需要编写一个程序来解决这个问题

输入第一行为一个整数 n ,表示字符串的长度

输入第二行为一个长度为 n 的字符串 s ,字符串中元素组成仅为 R 和 B

输出一个整数,代表长度为 n 的、字典序不小于 s 的字符串权值之和。

输入样例:

3

RBR

输出:

7

解释:共有 3 个字符串字典序大于等于"RBR",RBR权值为2,RRB为2,RRR为3。

1

来自左程云。

答案2023-09-07:

大体过程如下:

算法一(sum1):

1.定义函数sum1,它接收一个字符串作为参数,并返回字典序不小于该字符串的所有可能字符串中权值之和。

2.在sum1中,定义了辅助函数process1,它通过递归生成所有可能的字符串,并计算符合条件的字符串的权值之和。

3.在process1中,递归地生成新字符串,每次添加'R'或'B',直到生成的字符串长度与给定字符串长度相等。

4.如果生成的字符串与给定字符串相等或更大,返回权值之和,其中权值为'R'的个数。

5.如果生成的字符串小于给定字符串,返回0,表示没有符合条件的字符串。

6.在每个递归步骤中,将递归调用的结果相加,计算出所有可能字符串的权值之和。

7.在sum1函数中,调用process1函数并返回最终的权值之和。

算法二(sum3):

1.定义函数sum3,它接受一个字符串作为参数,并返回字典序不小于该字符串的所有可能字符串的权值之和。

2.在sum3中,首先初始化一些辅助数组和变量。

3.使用动态规划的方法来计算权值之和。

4.创建一个长度为n+1的dp数组,其中dp[i]表示以第i个字符作为起始字符的后缀字符串的权值之和。

5.初始化dp[n]为给定字符串最后一个字符的权值。

6.从右到左遍历字符串,计算dp数组的值。

7.如果当前字符是'R',根据公式计算p1和p2,然后将p1和p2相加得到dp[i]。

8.如果当前字符是'B',将dp[i+1]的值赋给dp[i]。

9.最后返回dp[0]作为最终的权值之和。

时间复杂度:

• 算法一(sum1)的时间复杂度为O(2^n),其中n是给定字符串的长度。因为它通过递归的方式生成所有可能的字符串。

• 算法二(sum3)的时间复杂度为O(n),其中n是给定字符串的长度。因为它使用动态规划计算权值之和。

额外空间复杂度:

• 算法一(sum1)的额外空间复杂度为O(n),因为递归调用process1函数可能会使用到O(n)的栈空间。

• 算法二(sum3)的额外空间复杂度为O(n),因为它使用了dp数组来存储中间结果,数组长度为n+1。

go完整代码如下:

在这里插入图片描述c++完整代码如下:

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OGR_flN90Qqfo8Xi4tcmaG0w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券