用于在电子邮件地址内移动点(句点)的算法

时间:2012-03-21 02:01:49

标签: c++ algorithm gmail

对于那些不知道的人,GMAIL允许您根据原始电子邮件创建可能无限数量的电子邮件。如果您的电子邮件是“mygmail@gmail.com”,那么可以通过两种方式实现:

1)在gmail末尾的“+”后面添加文字,例如mygmail+somethinghere@gmail.com 所有电子邮件仍将发送至mygmail@gmail.com

2)放置“。”在您的Gmail地址内(开头和结尾除外),例如m.ygmail @ gmail.com,mygmail @ gmail.com,m.yg.mai.l @ gmail.com等。注意:my..gmail @ gmai.com和mygmail@gm.ail.com不起作用!

我正在测试需要通过有效电子邮件地址注册的应用程序(发送电子邮件激活)。方法(1)是最简单的方法,但电子邮件地址字段不允许“+”。这意味着我需要使用方法(2)创建一个gmail帐户数据库。

有人可以帮助我使用算法(最好是C / C ++代码),我可以提供一段文字并生成所有可能的变体吗?

一些快速数学表明,可能的组合数量为2 ^(n - 1),其中n是电子邮件中的字符数。

由于

2 个答案:

答案 0 :(得分:3)

def generateComb(cur,rem):
    if len(rem)>0:
        generateComb(cur +rem[0], rem[1:])
        generateComb(cur+'.'+rem[0], rem[1:])
    else:
        print cur

generateComb('m','ygmail')

答案 1 :(得分:0)

伪代码为您提供另一种解决方案。你的想法是有2 ^(n - 1)种组合,其中n是电子邮件字符串的长度,所以我们用0到2 ^(n - 1) - 1的数字编码点的位置

假设s是没有@部分的电子邮件地址(在您的示例中为mygmail)。

n = length(s)
for i = 0 to 2^(n - 1) - 1
    s2 = ''
    for j = 0 to n - 2 do
        s2 = s2 + s[j]
        if (bit j in i is set)
           s2 = s2 + '.'
    s2 = s2 + s[n - 1]
    print s2

现在,如果你不想要所有的2 ^(n-1)组合(如果n> 15可能太大),只需限制第一个for循环,例如: 对于i = 0到999,获得前1000个组合。

在C / C ++中,2 ^(n-1)转换为1 <&lt;&lt; (n - 1)和(i中的位j设置)转换为((i&gt;&gt; j)&amp; 1)。