输入应该是一个字符串:
"abcd@gmail.com"
输出应该是一个字符串数组:
["abcd@gmail.com",
"a.bcd@gmail.com",
"ab.cd@gmail.com",
"abc.d@gmail.com",
"a.b.cd@gmail.com",
"a.bc.d@gmail.com",
"a.b.c.d@gmail.com"]
这个想法:“用点做第一个字符串部分(”abcd“)中的每个可能的组合。不允许连续的点。在第一个字符串部分的开头和结尾都没有允许的点(” ABCD “)”
这是我到目前为止所提出的:
text,s = "abcd".split""
i=0
def first_dot(text)
text.insert 1,"."
end
def set_next_dot(text)
i = text.rindex(".")
text.delete_at i
text.insert(i+1,".")
end
我的方法是
我不知道怎么把这些碎片放在一起。任何的想法?或许还有更好的方法? 提前谢谢
编辑: 我想我找到了解决方案:) 我将在大约一个小时内发布它(它很精彩 - >真值表,二进制数,换位)
...此处为解决方案
s = "abc"
states = s.length
possibilites = 2**states
def set_space_or_dot(value)
value.gsub("0","").gsub("1",".")
end
def fill_with_leading_zeros(val, states)
if val.length < states
"0"*(states-val.length)+val
else
val
end
end
a = Array.new(possibilites,s)
a = a.map{|x| x.split ""}
b = [*0...possibilites].map{|x| x.to_s(2).to_s}
b = b.map{|x| fill_with_leading_zeros x,states}
b = b.map{|x| x.split ""}
c = []
for i in 0 ... a.size
c[i] = (set_space_or_dot (a[i].zip b[i]).join).strip
end
答案 0 :(得分:2)
更改pduersteler回答:
possibilities = []
string = "abcd@example.com"
(string.split('@')[0].size-1).times do |pos|
possibility = string.dup
possibilities << possibility.insert(pos+1, '.')
end
答案 1 :(得分:1)
这个怎么样(可能需要更多微调以满足您的需求):
s = "abcd"
(0..s.size-1).map do |i|
start, rest = [s[0..i], s[(i+1)..-1]]
(0..rest.size-1).map { |j| rest.dup.insert(j, '.') }.map { |s| "#{start}#{s}"}
end.flatten.compact
#=> ["a.bcd", "ab.cd", "abc.d", "ab.cd", "abc.d", "abc.d"]
答案 2 :(得分:0)
一个选项是通过移动点的字符串迭代n次,其中n是字符数量减1.这是你现在正在做的,但没有定义两个方法。
这样的事情:
possibilities = []
string = "abcd@example.com"
(string.split('@')[0].size-1).times do |pos|
possibilities << string.dup.insert(pos+1, '.')
end
修改强>
现在测试了。感谢评论,你需要在插入之前在字符串上调用.dup
。否则,点会插入到字符串中,并且会在每次迭代时保持不变,从而导致混乱。在字符串上调用.dup
将复制字符串并在副本上工作,保持原始字符串不变。