模板串匹配问题题解 | 豆包MarsCode AI刷题

51 阅读3分钟

题目描述:

屏幕截图 2024-11-28 233255.png


思路解析: 在这个问题中,我们需要根据给定的模板字符串s以及一个整数k,找到按字典序排列后的k个合法的正整数。模板字符串s由数字字符和问号?组成,问号表示可以被替换为任意数字字符(0-9)。需要注意的是,生成的正整数不允许有前导零。

题目要求我们设计一个函数solution来实现上述功能。在编写解答之前,我们需要考虑几个关键点:

  • 模板字符串中问号的数量决定了可能生成的不同正整数的数量。
  • 字典序意味着从最小的数字开始逐渐增加。
  • 为了避免前导零,如果模板字符串的第一个字符是问号,那么它必须被替换为非零数字。

为了实现这一目标,我们可以将模板字符串中的所有问号视为需要填充的位置,并将这些位置看作一个进制系统,其中每一位的基数取决于其是否位于字符串的开头(如果是开头则基数为9,否则为10)。

接下来,我们将k转换成对应的“进制”数,这一步类似于将十进制数转换成其他进制,只不过这里的基数是变化的。通过这种方式,我们可以直接计算出第k个数字应该是什么,而不需要逐一生成并比较每个可能的数字。

具体步骤如下:

  • 首先检查模板字符串的第一个字符是否为问号。如果是,则将其替换为非零数字,确保不会产生前导零。
  • 确定模板字符串中问号的数量n。
  • 根据问号的数量,计算出第k个数字的每一位数值。
  • 最后,将计算得到的每一位数值与模板字符串中的非问号部分合并,形成最终结果。

这种方法避免了生成所有可能的数字并排序的高时间复杂度操作,而是直接定位到所需的数字,从而极大地提高了效率。

此外,如果在计算过程中发现k超出了可能的最大值,则返回-1,表示不存在这样的数字。

这个解决方案的时间复杂度主要取决于模板字符串中问号的数量,因为我们需要对每个问号进行处理。空间复杂度则是O(n),其中n是问号的数量,用于存储计算过程中的中间结果。

代码:

def solution(s: str, k: int) -> str:
    if s[0] == '0':
        return "-1"
    n = s.count('?')
    array = ['0'] * n
    if s[0]=="?":
        array[0]=1
    carry = k-1
    for i in range(n - 1, -1, -1):
        curValue = int(array[i]) + carry
        array[i] = str(curValue % 10)  
        carry = curValue // 10  
    if carry > 0:
        return "-1"
    ans = []
    ind = 0
    for ch in s:
        if ch == '?':
            ans.append(array[ind])
            ind += 1
        else:
            ans.append(ch)
    return ''.join(ans)