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

Algorithm for moving dots (period) within an email address

本文关键字:句点 算法 电子邮件地址 移动      更新时间:2023-10-16

对于那些不知道GMAIL的人,GMAIL允许你在原始电子邮件的基础上创建潜在的无限数量的电子邮件。如果您的电子邮件是"mygmail@gmail.com"那么这可以通过两种方式实现:

1) 在gmail末尾的"+"后添加文本,例如mygmail+somethinghere@gmail.com所有电子邮件仍将发送到mygmail@gmail.com

2) 在你的gmail地址中放置"."(开头和结尾除外)例如。m.ygmail@gmail.com,m.y.gmail@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是电子邮件中的字符数。

感谢

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')

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

假设s是您的电子邮件地址,没有@part(示例中为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,可能会太大),只需为第一个循环加上上限,例如:对于i=0到999,得到前1000个组合。

在C/C++中,2^(n-1)翻译为1<lt;(n-1),并且(i中的位j被设置)转换为((i>>j)&1) 。