查找字符串的所有 upper/lower/mixed 组合
Find all upper/lower/mixed combinations of a string
我需要这个用于使用 Lua 的游戏服务器..
我希望能够保存一个名字的所有组合
变成一个字符串,然后可以用于:
if exists (string)
示例:
ABC_-123
aBC_-123
AbC_-123
ABc_-123
abC_-123
等等
游戏中只有数字、字母和_ -
。可以用作名字。
(A_B-C, A-B.C, AB_8 ... etc)
我理解逻辑我只是不知道如何编码it:D
0-Lower
1-Upper
然后
000
001
等等
如果您只对 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"))
您可以使用递归生成器。第一个参数是目前生成的字符串的左边部分,第二个参数是原字符串剩下的右边部分。
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")
您只需存储中间结果而不是打印它们。
怎么做?
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
首都
基本上,对于每一个排列,你都必须用它来进行每一种可能的大写组合。
这应该不会太难,我相信你可以编码:)
你在开玩笑吗?
在这之后你可能会想知道。这一切真的有必要吗?好像有点多!
答案在于你在做什么。您真的需要给定字符的所有组合吗?我不这么认为。你说你需要它在评论中不区分大小写......但是你知道你可以简单地将它转换为 lower/upper 大小写吗?很简单
local str = "hELlO"
print(str:lower())
print(str:upper())
这是您存储名称的方式,否则您应该保持区分大小写。
你来决定
现在你选择你要做什么。无论你选择哪个方向,祝你好运!
我需要这个用于使用 Lua 的游戏服务器..
我希望能够保存一个名字的所有组合 变成一个字符串,然后可以用于:
if exists (string)
示例:
ABC_-123
aBC_-123
AbC_-123
ABc_-123
abC_-123
等等
游戏中只有数字、字母和_ -
。可以用作名字。
(A_B-C, A-B.C, AB_8 ... etc)
我理解逻辑我只是不知道如何编码it:D
0-Lower
1-Upper
然后
000
001
等等
如果您只对 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"))
您可以使用递归生成器。第一个参数是目前生成的字符串的左边部分,第二个参数是原字符串剩下的右边部分。
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")
您只需存储中间结果而不是打印它们。
怎么做?
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
首都
基本上,对于每一个排列,你都必须用它来进行每一种可能的大写组合。
这应该不会太难,我相信你可以编码:)
你在开玩笑吗?
在这之后你可能会想知道。这一切真的有必要吗?好像有点多!
答案在于你在做什么。您真的需要给定字符的所有组合吗?我不这么认为。你说你需要它在评论中不区分大小写......但是你知道你可以简单地将它转换为 lower/upper 大小写吗?很简单
local str = "hELlO"
print(str:lower())
print(str:upper())
这是您存储名称的方式,否则您应该保持区分大小写。
你来决定
现在你选择你要做什么。无论你选择哪个方向,祝你好运!