查找字符串的所有上/下/混合组合

时间:2015-11-01 15:47:23

标签: lua permutation uppercase lowercase

我需要使用Lua的游戏服务器..

我希望能够保存名称的所有组合 到一个字符串,然后可以用于:

if exists (string)

示例:

ABC_-123    
aBC_-123     
AbC_-123 
ABc_-123     
abC_-123

在游戏中只有数字,字母和_ -。可以用作名字。

(A_B-C, A-B.C, AB_8 ... etc)

我理解我不知道如何编写代码的逻辑:D

0-Lower    
1-Upper

然后

000    
001

3 个答案:

答案 0 :(得分:1)

您可以使用递归生成器。第一个参数包含到目前为止生成的字符串的左侧部分,第二个参数是原始字符串的剩余右侧部分。

function combinations(s1, s2)
        if s2:len() > 0 then
                local c = s2:sub(1, 1)
                local l = c:lower()
                local u = c:upper()
                if l == u then
                        combinations(s1 .. c, s2:sub(2))
                else
                        combinations(s1 .. l, s2:sub(2))
                        combinations(s1 .. u, s2:sub(2))
                end
        else
                print(s1)
        end
end

因此以这种方式调用函数。

combinations("", "ABC_-123")

您只需存储中间结果而不是打印它们。

答案 1 :(得分:0)

如果您只对exists功能感兴趣,那么您不需要所有组合。

local stored_string = "ABC_-123"

function exists(tested_string)
        return stored_string:lower() == tested_string:lower()
end

您只需以不区分大小写的方式比较存储的字符串和测试的字符串。

可以轻松测试:

assert(exists("abC_-123"))
assert(not exists("abd_-123"))

答案 2 :(得分:0)

如何做到这一点?

Lua中的原生函数可以生成字符串的所有排列,但这里有一些可能有用的东西。

<强> 子串

可能是最简单的解决方案,但也是最不灵活的。您可以检查给定字符串中是否存在子字符串,而不是组合。

if str:find(substr) then
    --code
end

如果这解决了你的问题,我非常推荐它。

获取所有排列

更昂贵,但仍然是一个有效的解决方案。这几乎完全符合您的要求。

function GetScrambles(str, tab2)
   local tab = {}
   for i = 1,#str do
      table.insert(tab, str:sub(i, i))
   end
   local tab2 = tab2 or {}
   local scrambles = {}
   for i = 0, Count(tab)-1 do
      local permutation = ""
      local a = Count(tab)
      for j = 1, #tab do
         tab2[j] = tab[j]
      end

      for j = #tab, 1, -1 do
         a = a / j
         b = math.floor((i/a)%j) + 1
         permutation = permutation .. tab2[b]
         tab2[b] = tab2[j]
      end
      table.insert(scrambles, permutation)
   end
   return scrambles
end

您提出的问题

基本上这正是你最初要求的。它与上面的代码相同,除了字符串的每个子字符串。

function GetAllSubstrings(str)
    local substrings = {}
    for i = 1,#str do
        for ii = i,#str do
            substrings[#substrings+1]=str:sub(ii)
        end
    end
    return substrings
end

<强> 资本

对于每一个排列,你基本上都必须用它来完成所有可能的资本组合。

这应该不会太难,我相信你可以编码:)

你在开玩笑吗?

在此之后你可能会想知道。所有这些真的是否必要?好像有点多了!

答案就在于你在做什么。你真的需要给定字符的所有组合吗?我不这么认为。你说你在评论中需要它不区分大小写......但是你知道你可以简单地将它转换成大写/小写吗?这很简单

local str = "hELlO"
print(str:lower())
print(str:upper())

这是你应该如何存储名称,否则你应该区分大小写。

您决定

现在你选择你将要做的事情。无论你选择哪个方向,我祝你好运!