生成由"a-z"26 位字母组成的 ,五位长度的所有字符串,不限语言,不限方法! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xming
V2EX    问与答

生成由"a-z"26 位字母组成的 ,五位长度的所有字符串,不限语言,不限方法!

  •  
  •   xming 2014-09-12 15:0:49 +08:00 8635 次点击
    这是一个创建于 4066 天前的主题,其中的信息可能已经有所发展或是发生改变。
    62 条回复    2014-09-13 21:30:57 +08:00
    bigcoon
        1
    bigcoon  
       2014-09-12 15:31:58 +08:00   1
    var a = 'abcdefghijklmnopqrstuvwxyz';
    var f = function (d, p) {
    !p && (p = '');
    for (var i = 0; i < a.length; i++) {
    var s = a[i], s2 = p + s;
    if (s2.length < d)f(d, s2);
    else console.log(s2);
    }
    }
    f(5);
    Automan
        2
    Automan  
       2014-09-12 15:34:27 +08:00   1
    重复还是不重复?
    ChanneW
        3
    ChanneW  
       2014-09-12 15:37:22 +08:00
    26^5
    kamal
        4
    kamal  
       2014-09-12 15:43:28 +08:00
    这是考手写排列公式?
    clino
        5
    clino  
       2014-09-12 15:44:11 +08:00
    python:

    import itertools
    print map("".join,list(itertools.product("abcdefghijklmnopqrstuvwxyz",repeat=5)))
    clino
        6
    clino  
       2014-09-12 15:47:46 +08:00   1
    不用map会更好一点,这样不会占太多内存
    import itertools
    for l in itertools.product("abcdefghijklmnopqrstuvwxyz",repeat=5):print "".join(l)
    ziyuan
        7
    ziyuan  
       2014-09-12 15:49:23 +08:00   1
    java

    import java.util.ArrayList;
    import java.util.List;

    public class Test {
    private static char[] is = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'l', 'm', 'n', 'o', 'p','q', 'r', 's', 't', 'u', 'v', 'w', 'x','y','z'};
    private static int total;
    private static int m = 5;
    public static void main(String[] args) {
    List<Integer> iL = new ArrayList<Integer>();
    new Test().plzh("", iL, m);
    System.out.println("total : " + total);
    }
    private void plzh(String s, List<Integer> iL, int m) {
    if(m == 0) {
    System.out.println(s);
    total++;
    return;
    }
    List<Integer> iL2;
    for(int i = 0; i < is.length; i++) {
    iL2 = new ArrayList<Integer>();
    iL2.addAll(iL);
    if(!iL.contains(i)) {
    String str = s + is[i];
    iL2.add(i);
    plzh(str, iL2, m-1);
    }
    }
    }
    }
    imn1
        8
    imn1  
       2014-09-12 15:52:30 +08:00   2
    import itertools
    list("".join(x) for x in itertools.product('abcdefghijklmnopqrstuvwxyz', repeat=5))
    YouXia
        9
    YouXia  
       2014-09-12 15:53:56 +08:00   1
    题意有点不明啊,是否有序啊,比如 a b c d e 与 a c b d e 是否相同?
    xming
        10
    xming  
    OP
       2014-09-12 15:58:41 +08:00
    @Automan 不能重复,要不同
    xming
        11
    xming  
    OP
       2014-09-12 15:59:06 +08:00
    @YouXia 无序的
    xming
        12
    xming  
    OP
       2014-09-12 16:00:55 +08:00
    @clino 不计算内存消耗,只要不卡死。
    ziyuan
        13
    ziyuan  
       2014-09-12 16:04:27 +08:00
    @imn1 python居然这么方便啊。。赞
    hahastudio
        14
    hahastudio  
       2014-09-12 16:07:12 +08:00   1
    那么就
    from itertools import combinations
    from string import ascii_lowercase as lowercase
    for c in combinations(lowercase, 5):
    ....print ''.join(c)
    toctan
        15
    toctan  
       2014-09-12 16:07:52 +08:00   4
    Ruby

    ('aaaaa'..'zzzzz').to_a
    imn1
        16
    imn1  
       2014-09-12 16:09:20 +08:00
    itertools还是太慢了,array+tobytes应该更快,或者用numpy或pandas直接生成一个数字矩阵,再chr/tobytes后合并变形~
    机器太旧,不测试了~
    rails3
        17
    rails3  
       2014-09-12 16:09:26 +08:00
    @toctan ruby更方便
    paolongtao
        18
    paolongtao  
       2014-09-12 16:10:44 +08:00
    @toctan 哈哈
    iptux
        19
    iptux  
       2014-09-12 16:15:08 +08:00   3
    BASH 来一发

    ```bash
    echo {a..z}{a..z}{a..z}{a..z}{a..z}
    ```
    ChiangDi
        20
    ChiangDi  
       2014-09-12 16:15:26 +08:00
    哈哈哈哈看起来没有哪种语言能短过 Ruby 了。
    /td>
    minix
        21
    minix  
       2014-09-12 16:20:47 +08:00   1
    linux命令符输入 < /dev/urandom LC_CTYPE=C tr -dc a-z | head -c5
    hahastudio
        22
    hahastudio  
       2014-09-12 17:00:20 +08:00
    @toctan 貌似 LZ 要的是组合?
    zhs227
        23
    zhs227  
       2014-09-12 17:28:01 +08:00
    @hahastudio 用node运行了一把楼主的脚本,生成的是排列。
    ruby的结果是一样的。
    hahastudio
        24
    hahastudio  
       2014-09-12 17:30:17 +08:00
    @zhs227 LZ 给脚本了?
    zhs227
        25
    zhs227  
       2014-09-12 17:36:10 +08:00
    @hahastudio 汗,看错了,运行的是一楼的脚本。

    个人理解,abcde和acbde不应该理解为同一个字符串,另外楼主要求长度一定为5.
    hahastudio
        26
    hahastudio  
       2014-09-12 17:44:54 +08:00
    @zhs227 主要是不知道 LZ 指的这个“无序的” 是什么
    我觉得应该指的是组合= =
    jevonszmx
        27
    jevonszmx  
       2014-09-12 18:28:54 +08:00   1
    ```php


    # 不管有木有重复的
    for($i = 0;$i < 5;$i ++){ echo chr(rand(97,122)); }

    # 不能有重复的

    $chars = array();
    for($i = 97;$i <= 122;$i ++){
    $chars = array_unique($chars);
    if (5 == count($chars)) {
    break;
    }
    $chars[] = chr(rand(97,122));
    }
    $chars = implode('', $chars);
    echo($chars);

    ```
    orzfly
        28
    orzfly  
       2014-09-12 18:33:54 +08:00   1
    @toctan [*'aaaaa'..'zzzzz']
    billlee
        29
    billlee  
       2014-09-12 18:52:34 +08:00   1
    char str[] = "aaaaa";
    while(str[0] <= 'z'){
    printf("%s\n", str);
    for(int i=4; i>=0; i--){
    str[i]++;
    if(str[i] > 'z'){
    str[i] = 'a';
    }else{
    break;
    }
    }
    }
    ffffwh
        30
    ffffwh  
       2014-09-12 18:59:29 +08:00
    排列组合嘛,好像够资格上算法书了。
    当然库函数就。。。
    feiyuanqiu
        31
    feiyuanqiu  
       2014-09-12 20:22:01 +08:00
    for ($i = 'a'; $i <= 'zzzzz'; $i++) {
    var_dump($i);
    }
    lightening
        32
    lightening  
       2014-09-12 20:34:17 +08:00
    @zhs227 组合的话 Ruby:

    ('a'..'z').to_a.combination(5).map(&:join)
    feiyuanqiu
        33
    feiyuanqiu  
       2014-09-12 20:39:44 +08:00
    31楼的回复有问题,我改了一下...但是现在有需求要做,待会才有时间调试...
    jesse_luo
        34
    jesse_luo  
       2014-09-12 21:19:41 +08:00
    #include <stdio.h>

    #define LEN 5

    void gen(char *str, int last) {
    char i;
    for (i = 'a'; i <= 'z'; i++)
    {
    *str = i;
    if (0 != last) gen(str+1, last-1);
    else printf("%s\n", str-LEN+1); }
    }

    int main() {
    char str[LEN];
    gen(str, LEN-1);
    }

    c的……
    feiyuanqiu
        35
    feiyuanqiu  
       2014-09-12 21:25:08 +08:00
    for ($i = 'aaaaa'; $i <= 'zzzzz'; $i++) {
    var_dump($i);
    }
    好了,php的
    jucelin
        36
    jucelin  
       2014-09-12 21:25:40 +08:00
    题主要的是 “五位长度的所有字符串” ,楼上们提供的有点不对题吧
    P233
        37
    P233  
       2014-09-12 21:30:46 +08:00   1
    蛋疼的 Sass 版,不过不是字符串

    P233
        38
    P233  
       2014-09-12 21:35:04 +08:00
    打错了 22 行 $2 应该是 $e
    feiyuanqiu
        39
    feiyuanqiu  
       2014-09-12 21:42:19 +08:00
    @P233 终于遇见一个用 birds of paradise 主题的了...有品位!
    P233
        40
    P233  
       2014-09-12 22:01:56 +08:00
    @feiyuanqiu 一直觉得这个看着比较舒服,设计也很合理 :)
    zhs227
        41
    zhs227  
       2014-09-12 22:08:40 +08:00
    @lightening 高手,刚出去的路上还在想着组合有什么办法呢, Rails的数组太强大了
    artwalk
        42
    artwalk  
       2014-09-12 22:25:08 +08:00
    ```Swift
    let alp = "abcdefghijklmnopqrstuvwxyz"

    func puts (s:String, i:Int) {
    if i <= 0 {
    println(s)
    return
    }

    for c in alp {
    puts (("\(c)" + s), i - 1)
    }
    }

    puts ("", 5)


    ```

    求更简单的办法

    PS:
    1. Playground 测试用的 `puts ("", 3)` ,没敢直接上 5
    2. Ruby 的太变态了,这也是我喜欢的原因
    orzfly
        43
    orzfly  
       2014-09-12 22:29:38 +08:00
    @lightening combination 是不会重复的,你需要 repeated_combination。

    [*?a..?z].repeated_combination(5).map(&:join)
    orzfly
        44
    orzfly  
       2014-09-12 22:30:59 +08:00
    顺带一提 ruby 还可以这样…… [*?a*5..?z*5]
    zakokun
        45
    zakokun  
       2014-09-12 22:41:10 +08:00   1
    这是我写的很傻的php....生成的文件有67M......
    <script src="https://gist.github.com/zakokun/f7fbe7e3f9d7410396e7.js"></script>
    feiyuanqiu
        46
    feiyuanqiu  
       2014-09-12 23:21:37 +08:00
    @zakokun ...不用这么复杂,字母都是ascii码,可以用循环来生成的,一行代码就解决了
    26*26*26*26*26*6/1024/1024 = 67
    你的结果是对的...
    lightening
        47
    lightening  
       2014-09-12 23:29:08 +08:00
    @orzfly 啊,看错需求了……
    zakokun
        48
    zakokun  
       2014-09-12 23:37:24 +08:00
    @feiyuanqiu 看了下你写的,好神奇......学习了
    xiaowangge
        49
    xiaowangge  
       2014-09-12 23:52:36 +08:00   1


    笨办法来了。
    xiaowangge
        50
    xiaowangge  
       2014-09-13 00:01:27 +08:00
    又读了一遍需求,是「所有」 :-)
    feiyuanqiu
        51
    feiyuanqiu  
       2014-09-13 00:59:05 +08:00
    @zakokun ...我的写错了,不能用 <=号,只能用< 或者!=。

    原因是:在PHP中,对字母进行增减运算时遵循的是Perl的方式而不是C的,在Perl中,是通过首字母比较大小:比如,b > az。

    具体到这里:
    当$i = 'zzzzz'的时候,$i <= 'zzzzz'是成立的,循环不会终止,这时$i++ => 'aaaaaa','aaaaaa' < 'zzzzz',循环继续...直到$i = 'yzzzzz',这时,$i < 'zzzzz',$i++ => 'zaaaaa', $i > 'zzzzz',循环终止。所以最后一个输出是 ’yzzzzz';

    http://stackoverflow.com/questions/4098345/why-doesnt-this-code-simply-print-letters-a-to-z

    修改之后是这样的:
    for ($i = 'aaaaa'; $i < 'zzzzz'; $i++) { echo $i; } echo $i;
    或者:
    $c = 'aaaaa';
    for ($i = 0; $i < 11881376; $i++) { echo $c++; }
    mudenng
        52
    mudenng  
       2014-09-13 01:00:50 +08:00
    C++版的。。。就是个DFS
    feiyuanqiu
        53
    feiyuanqiu  
       2014-09-13 01:03:40 +08:00
    for ($c = 'aaaaa', $i = 0; $i < 11881376; $i++, $c++) { echo $c; }
    zeq
        54
    zeq  
       2014-09-13 08:36:06 +08:00
    zeq
        55
    zeq  
       2014-09-13 08:47:0 +08:00
    @zeq 搞错了, 唉~
    jsq2627
        56
    jsq2627  
       2014-09-13 12:17:12 +08:00
    上面都是发代码的,我来发点算法的知识吧。
    http://www.cnblogs.com/autosar/archive/2012/04/08/2437799.html
    zakokun
        57
    zakokun  
       2014-09-13 13:00:18 +08:00
    @feiyuanqiu 确实,不能用 $i <='zzzzz' 但我想了下, 'zaaaaa', 依然是小于 'zzzzz'的诶,直到 $i='zzzzzy'的时候,$i+1='zzzzzz'这时候才大于'zzzzz' 才会跳出循环.是这样吧?
    feiyuanqiu
        58
    feiyuanqiu  
       2014-09-13 13:11:07 +08:00   1
    @zakokun 实际上是zzzzyz
    cha1
        59
    cha1  
       2014-09-13 13:23:59 +08:00
    @xiaowangge 你这样好像是随机产生 'a-zA-Z'的5位数字吧?
    我这边的运行结果:
    src ./test.py
    RVTwn
    src ./test.py
    akJtF
    src ./test.py
    IXSJU
    zakokun
        60
    zakokun  
       2014-09-13 13:29:19 +08:00
    @feiyuanqiu you are right......
    coolicer
        61
    coolicer  
       2014-09-13 14:33:40 +08:00
    ruby开挂啊
    jedihy
        62
    jedihy  
       2014-09-13 21:30:56 +08:00 via iPhone
    这是算法题,用dfs
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4313 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:13 PVG 08:13 LAX 17:13 JFK 20:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86