【问题标题】:How can I optimize this Lua function?如何优化这个 Lua 函数?
【发布时间】:2021-01-25 12:16:43
【问题描述】:

目前只是在寻找一种让这段代码更快的方法。

这个函数目前接受一个字符串s和一个int类型k,并返回s长度k中元音最多的子字符串。

例子:

s = caberqiitefg k = 5

输出:

二七

erqii是s中元音最多的长度为5的子串。

返回“未找到!”如果字符串中没有元音。

function findSubstring(s, k)
    local sub = string.sub
    local gsub = string.gsub
    local vowels = "[aeiou]"
    local empty = ""
    local _, numberOfVowels = gsub(s, vowels, empty)
    if numberOfVowels == 0 then
        return "Not found!"
    end
    local mostVowels = nil
    local vowelnum = 0
    for i = 1, #s - k + 1 do
        local curr = sub(s, i, k + i - 1)
        local _, nvow = gsub(curr, vowels, empty)
        if mostVowels == nil or (nvow > vowelnum) then
            mostVowels = curr
            vowelnum = nvow
        end
    end
    return mostVowels
end

【问题讨论】:

  • 编写基准测试并尝试。
  • 在 C 中重新实现它不是一种选择吗?

标签: string lua


【解决方案1】:

不是,但我发现这个修改后的版本在某些情况下运行得更好


function findSubstring2(s, k)
    local sub = string.sub
    local gsub = string.gsub
    local vowels = "[aeiou]"
    local empty = ""
    local _, numberOfVowels = gsub(s, vowels, empty)
    if numberOfVowels == 0 then
        return "Not found!"
    end

    local candidate = nil
    local vowelnum = 0
    local i=1
    while i <= #s-k+1 do
        local curr = sub(s, i, k + i - 1)
        local _, nvow = gsub(curr, vowels, empty)
        if nvow > vowelnum then
            candidate = curr
            vowelnum = nvow
        end
        i=i+(curr:find(vowels) or #curr)
    end
    return candidate
end

如您所见,它总是跳到下一个元音,这 1. 使高位 k 在长 s 中更快,目标字符串之前有长链的辅音,2. 意味着它可能会跳过一个有效序列在#s-k 之后有它的第一个元音(子字符串可以开始的最后一个位置),你必须通过一些特殊情况来减轻它。

这种加速是否值得取决于您的平均输入字符串是什么样的。

【讨论】:

    【解决方案2】:
    str1 = 'caberqiitefg'
    k = 5
    j = k
    max = 0
    max_sub = ""
    arr = ["a","e","i","o","u"]
    for i in range(len(str1)):
        sub = str1[i:j]
        p= 0
        for m in arr:
            p += sub.count(m)
        if p!= 0 and p>max:
            max = p
            max_sub = sub
        j+=1
    print(max_sub)
    

    我使用了一些变量和一个列表来降低空间复杂度。

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多