【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS

LeetCode1625:执行操作后的最小字典序字符串解题
文章讲述了给定一个偶数长度的数字字符串s和两个整数a、b,需要通过累加奇数位置的数字和字符串轮转操作找到字典序最小的结果。当b为偶数时只累加奇数位,b为奇数时可累加所有位。使用BFS遍历所有可能状态,找到最小字典序的字符串。时间复杂度为O(n^2d^2),空间复杂度为O(nd^2)。

执行操作后字典序最小的字符串【LC1625】

给你一个字符串 s 以及两个整数 ab 。其中,字符串 s 的长度为偶数,且仅由数字 09 组成。

你可以在 s 上按任意顺序多次执行下面两个操作之一:

  • 累加:将 a 加到 s 中所有下标为奇数的元素上(下标从 0 开始)。数字一旦超过 9 就会变成 0,如此循环往复。例如,s = "3456"a = 5,则执行此操作后 s 变成 "3951"
  • 轮转:将 s 向右轮转 b 位。例如,s = "3456"b = 1,则执行此操作后 s 变成 "6345"

请你返回在 s 上执行上述操作任意次后可以得到的 字典序最小 的字符串。

如果两个字符串长度相同,那么字符串 a 字典序比字符串 b 小可以这样定义:在 ab 出现不同的第一个位置上,字符串 a 中的字符出现在字母表中的时间早于 b 中的对应字符。例如,"0158” 字典序比 "0190" 小,因为不同的第一个位置是在第三个字符,显然 '5' 出现在 '9' 之前。

做着做着忘记累加奇数位偶数位的次数分别相同了,然后就WA了
感觉最近的中等题都很难呀

  • 思路

    • 首先,如果b为偶数,那么我们只能对奇数位做累加操作;如果b为奇数,那么我们能对所有数字进行累加操作【轮转后奇偶性相反】
    • 那么我们可以使用BFS暴力搜索所有可能的状态,然后取字典序最小的状态即可
      • 从队列中取出字符串,将其与答案进行比较,如果当前字符串字典序更小,那么更新答案
      • 然后对该字符串进行累加和轮转操作,直至得到新的字符串
      • 如果新的字符串没有出现过,那么将其入队,并更新哈希表
      • 重复以上操作,直至队列为空
  • 实现

    class Solution {
        public String findLexSmallestString(String s, int a, int b) {
            Deque<String> q = new ArrayDeque<>();
            q.offer(s);
            Set<String> vis = new HashSet<>();
            vis.add(s);
            String ans = s;
            int n = s.length();
            while (!q.isEmpty()) {
                s = q.poll();
                if (ans.compareTo(s) > 0) {
                    ans = s;
                }
                char[] cs = s.toCharArray();
                for (int i = 1; i < n; i += 2) {
                    cs[i] = (char) (((cs[i] - '0' + a) % 10) + '0');
                }
                String t1 = String.valueOf(cs);
                String t2 = s.substring(b) + s.substring(0, b);
                for (String t : List.of(t1, t2)) {
                    if (vis.add(t)) {
                        q.offer(t);
                    }
                }
            }
            return ans;
        }
    }
    
    作者:ylb
    链接:https://leetcode.cn/problems/lexicographically-smallest-string-after-applying-operations/solutions/2177449/python3javacgo-yi-ti-shuang-jie-bfs-bao-xl8n2/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度

      • 时间复杂度:O(n2d2)O(n^2d^2)O(n2d2),ddd为枚举累加次数的上限,本题中为10
      • 空间复杂度:O(nd2)O(nd^2)O(nd2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值