LeeCode 1625 暴力

这篇博客介绍了LeetCode第1625题的解决方案,涉及字符串操作和数学概念。题目要求在执行特定操作后找到字典序最小的字符串。博主通过累加和轮转策略分析了问题,并利用裴蜀定理计算了可能的字符串首元素变化,最终实现了算法来找出最小字典序的字符串。
摘要由CSDN通过智能技术生成
题意

传送门 LeeCode 1625. 执行操作后字典序最小的字符串

题解

考虑累加,奇数下标元素同时增加 a a a 的整数倍,而处理结果最多只有 10 10 10 种不同的情况,因为对个位数产生影响的只有 a a a 0 − 9 0-9 09 倍。

考虑轮转,设字符串长度为 n n n,则元素下标变为 i + x × b = j ( m o d   n ) , x ∈ Z i+x\times b = j(mod\ n),x\in Z i+x×b=j(mod n),xZ,则 j j j 的可能值为 i + x × b + y × n , x ∈ Z , y ∈ Z i+x\times b+y\times n,x\in Z, y\in Z i+x×b+y×n,xZ,yZ;由裴蜀定理可知,对于任意的整数 x , y x, y x,y g c d ( a , b ) gcd(a, b) gcd(a,b) ( a x + b y ) (ax + by) (ax+by) 的最小正值;那么 j − i j-i ji 的最小差值为 g c d ( n , b ) gcd(n,b) gcd(n,b),枚举不同的字符串首元素即可,只有 n / g c d ( n , b ) + 1 n/gcd(n,b)+1 n/gcd(n,b)+1 种可能。

class Solution
{
public:
    string findLexSmallestString(string s, int a, int b)
    {
        vector<int> table(10);
        for (int i = 0; i < 10; ++i)
            table[i] = a * i;
        int n = s.length(), gcd = __gcd(n, b), ub = (gcd & 1) ? 10 : 1;
        string str = s + s, res = s;
        for (int k = 0; k < n; k += gcd)
        {
            string tmp = str.substr(k, n);
            for (int i = 0; i < 10; ++i)
            {
                for (int j = 0; j < ub; ++j)
                {
                    string tmp2(tmp);
                    for (int t = 1; t < n; t += 2)
                    {
                        tmp2[t] = (tmp2[t] - '0' + table[i]) % 10 + '0';
                    }
                    for (int t = 0; t < n; t += 2)
                    {
                        tmp2[t] = (tmp2[t] - '0' + table[j]) % 10 + '0';
                    }
                    res = min(res, tmp2);
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值