当前位置: 首页 > news >正文

Leetcode 3474. Lexicographically Smallest Generated String

  • Leetcode 3474. Lexicographically Smallest Generated String
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3474. Lexicographically Smallest Generated String

1. 解题思路

这一题思路上主要就是分成两步:

  1. 找到所有为T的位置,此时其对应的位置及其后续m-1个字符必然就是str2
  2. 在所有未填的字符当中填入其他字符使其在满足条件的情况下字典序最小

其中,有关第一步,我们需要保证我们在填入本身的合法性,因此我们需要在填入位置重叠的情况下判断填入的合法性,即交错的部分必须完全一致,此时我们就是要判断对应位置的子串是否与头部位置的子串完全重合。这个我们可以轻松地通过z算法进行实现,对应的内容可以参考拙作《经典算法:Z算法(z algorithm)》,这里我们就不过度展开了。

另外,关于第二步,我们只需要考察在每一个未填的位置可以填入最小字符a即可,这样,我们就可以确保对应的字符串合法且字典序最小。

而要判断某个位置是否可以填入某个字符,这里我做的比较暴力,即考察包含其本身的前m个字符分别作为开头时是否刚好有某个子串恰好为str2,如果没有就是合法的,反之就必然不合法。

最后需要注意的是,我们还需要考察一下每一个F所在的位置对应的子串是否真的都不合法,它有时会和第一步产生矛盾,此时我们需要去掉对应的情况。

2. 代码实现

给出python代码实现如下:

def z_algorithm(s):
    n = len(s)
    z = [0 for _ in range(n)]
    l, r = -1, -1
    for i in range(1, n):
        if i > r:
            l, r = i, i
            while r < n and s[r-l] == s[r]:
                r += 1
            z[i] = r-l
            r -= 1
        else:
            k = i - l
            if z[k] < r - i + 1:
                z[i] = z[k]
            else:
                l = i
                while r < n and s[r-l] == s[r]:
                    r += 1
                z[i] = r-l
                r -= 1
    z[0] = n
    return z

class Solution:
    def generateString(self, str1: str, str2: str) -> str:
        n, m = len(str1), len(str2)
        z = z_algorithm(str2 + str2)[m:]
        
        ans = ["" for _ in range(n+m-1)]
        nxtT = n
        for i in range(n-1, -1, -1):
            ch = str1[i]
            if ch == "T":
                if nxtT == n or nxtT-i >= m:
                    for j in range(i, i+m):
                        ans[j] = str2[j-i]
                elif z[nxtT-i] >= m-(nxtT-i):
                    for j in range(i, nxtT):
                        ans[j] = str2[j-i]
                else:
                    return ""
                nxtT = i
                
        def is_allowed(idx, ch):
            lb = max(idx-m+1, 0)
            rb = min(n-1, idx)
            
            def is_not_same(i):
                return str2[idx-i] != ch or any(ans[i+j] != str2[j] for j in range(m) if i+j != idx)
            
            return all(is_not_same(i) for i in range(lb, rb+1))

        prefix = str2[:-1]
        for i in range(n+m-1):
            if ans[i] != "":
                if i < n and str1[i] == "F" and all(ans[i+j] == str2[j] for j in range(m)):
                    return ""
                continue
            for ch in string.ascii_lowercase:
                if is_allowed(i, ch):
                    ans[i] = ch
                    break
        return "".join(ans)

提交代码评测得到:耗时2665ms,占用内存18.4MB。

相关文章:

  • 掌握 findIndex、push 和 splice:打造微信小程序的灵活图片上传功能✨
  • windows环境执行composer install出错
  • mac上最好的Python开发环境之Anaconda+Pycharm
  • 关于高精度力扣66
  • HTTP 状态代码 501 502 问题
  • 深度学习神经网络分类原理
  • centOS 环境 安装redis方法
  • DeepSearchAcademic-基于舆情中文核心论文的deepsearch的个人项目
  • 常见的网络协议介绍
  • Linux中使用cpulimit 限制 cpu 占用率
  • windows 上删除 node_modules
  • Zookeeper 及 基于ZooKeeper实现的分布式锁
  • 设计模式说明
  • 基于Python的新闻采集与分析:新闻平台的全面数据采集实践
  • 【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置
  • ADB、Appium 和 大模型融合开展移动端自动化测试
  • 什么是线程安全?并行计算
  • 用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!
  • 26-小迪安全-模块引用,mvc框架,渲染,数据联动0-rce安全
  • Unity NGUI新手向几个问题记录
  • 和孕妇做网站/邯郸seo营销
  • 网站建设竞品调研/网店代运营正规公司
  • 长沙建站网/四川seo选哪家
  • 佛山推广系统/深圳seo公司
  • 广州建站公司网站/软文文案案例
  • 石家庄市城乡建设部网站/今天全国31个省疫情最新消息