题面
思路
首
先
,
数
据
量
很
小
,
考
虑
可
否
枚
举
所
有
情
况
?
首先,数据量很小,考虑可否枚举所有情况?
首先,数据量很小,考虑可否枚举所有情况?
对
于
累
加
和
轮
转
操
作
,
稍
作
分
析
,
可
知
两
个
操
作
是
独
立
的
。
对于累加和轮转操作,稍作分析,可知两个操作是独立的。
对于累加和轮转操作,稍作分析,可知两个操作是独立的。
我
们
就
需
要
考
虑
一
个
问
题
,
轮
转
的
次
数
最
大
为
多
少
呢
?
我们就需要考虑一个问题,轮转的次数最大为多少呢?
我们就需要考虑一个问题,轮转的次数最大为多少呢?
通
过
分
析
,
字
符
串
长
度
为
n
,
每
次
左
指
针
向
左
移
动
b
,
也
就
是
说
移
动
n
次
一
定
可
以
移
回
原
串
。
通过分析,字符串长度为n,每次左指针向左移动b,也就是\\说移动n次一定可以移回原串。
通过分析,字符串长度为n,每次左指针向左移动b,也就是说移动n次一定可以移回原串。
图
解
图解
图解
因
此
,
轮
次
操
作
次
数
不
会
超
过
n
次
因此,轮次操作次数不会超过n次
因此,轮次操作次数不会超过n次
那
么
,
累
加
操
作
最
大
是
多
少
呢
?
那么,累加操作最大是多少呢?
那么,累加操作最大是多少呢?
对
于
一
位
数
x
,
(
x
+
10
)
%
10
=
x
,
也
就
是
说
最
多
不
超
过
10
次
对于一位数x,(x+10)\%10=x,也就是说最多不超过10次
对于一位数x,(x+10)%10=x,也就是说最多不超过10次
因 此 该 问 题 得 以 解 决 , 复 杂 度 是 O ( n 2 ∗ 10 ∗ 10 ) 因此该问题得以解决,复杂度是O(n^2*10 * 10) 因此该问题得以解决,复杂度是O(n2∗10∗10)
class Solution {
public:
int n;
char add(char t, int v){
int tt = t - '0'; tt += v; tt %= 10;
return tt + '0';
}
string findLexSmallestString(string s, int a, int b) {
string tmp = s, ans;
ans = s;
n = s.size();
for(int i = 1; i <= b; i++){
tmp += s;
}
for(int l = b * n; (l % n) || l == b * n; l -= b){
for(int i = 0; i < 10; i++){
string p;
if(b & 1){
for(int j = 0; j < 10; j++){
p = tmp.substr(l, n);
for(int x = 1; x < n; x += 2){
p[x] = add(p[x], i * a);
}/*奇数位*/
for(int x = 0; x < n; x += 2){
p[x] = add(p[x], j * a);
}/*偶数位*/
ans = min(ans, p);
}
}
else{
p = tmp.substr(l, n);
for(int x = 1; x < n; x += 2){
p[x] = add(p[x], i * a);
}/*奇数位*/
ans = min(ans, p);
}
}
}
return ans;
}
};