3 solutions
-
0
题解思路
本题要求从一个由数字组成的字符串
M
中找到一个子串,与一个给定的数字N
进行运算(加、减、乘),使得运算结果符合以下条件:- 结果的所有数位相同:即运算结果的每一位数都相同(例如
4444
、77777
等)。 - 选择最大值:若有多个符合条件的子串,则选择运算结果最大的一个子串作为最终答案。
运算规则要求子串长度在
3
到12
之间,并且在乘法运算的情况下,子串最多3
位,以防止结果过大。详细步骤
-
遍历子串:由于密码串的长度限制在
3
到12
之间,因此我们可以枚举从M
中提取不同长度的子串。以长度从12
到3
的顺序枚举,可以在找到符合要求的结果后提前结束遍历。 -
计算运算结果:
- 对每一个提取出的子串,根据运算符
k
(加、减、乘),与密钥数字N
进行计算,得到运算结果。 - 运算结果需要满足所有位数相同。为此,检查结果的各位数,判断其是否符合条件。
- 对每一个提取出的子串,根据运算符
-
结果筛选:
- 如果运算结果的各位数相同且比当前最大值大,则更新最终结果。
- 若有多个符合条件的子串,则选择其中运算结果最大的子串。
-
终止条件:如果在当前长度的子串中找到满足要求的最大值,则直接输出结果。否则,继续尝试较短的子串,直到找到符合条件的结果。
复杂度分析
- 时间复杂度:对于字符串长度
N
,子串的长度上限为12
,因此枚举子串的复杂度约为O(N * 12)
。对于每个子串,进行一次运算和检测符合条件的操作,时间复杂度为常数级。因此,整体时间复杂度为O(N)
。 - 空间复杂度:仅需常数空间存储运算结果和遍历子串,不涉及额外的复杂数据结构,因此空间复杂度为
O(1)
。
代码实现
Python代码
C++代码
Java代码
示例解释
对于输入示例:
-
若
M = "6833023887793076998810418710"
,N = 2211
,k = '-'
:- 符合条件的子串有
8877
和9988
。9988 - 2211 = 7777
是最大结果。
- 符合条件的子串有
-
若
M = "68846787793076946788418710"
,N = 4210
,k = '+'
:- 符合条件的子串为
884678
,884678 + 4210 = 888888
是最大结果。
- 符合条件的子串为
- 结果的所有数位相同:即运算结果的每一位数都相同(例如
- 1
Information
- ID
- 24
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 214
- Accepted
- 27
- Uploaded By