临睡前向 v 友请教一个问题, js 如何实现字符串‘a’到‘zzzz’的遍历?

2017-02-26 00:47:57 +08:00
 xiaoxiuaoliang
如题中所述,使用 javascript ,如何实现从‘ a ’到‘ zzzz ’的遍历,即:
a
b
...
z
aa
ab
...
az
ba
bb
...
...
zz
aaa
aab
...
...
zzz
aaaa
aaab
...
zzzz

如果此题可以表述为:如何实现长度为 1 的字符串‘ a ’到长度为 4 的字符串‘ zzzz ’的遍历,那么更一般地,如何实现长度为 m 的字符串 a 到长度为 n 的字符串 b 的遍历?
3592 次点击
所在节点    问与答
23 条回复
azh7138m
2017-02-26 00:51:25 +08:00
这个和从 x 遍历到 y 并输出是一样的,只不过这个是 26 进制罢了
aheadlead
2017-02-26 00:53:56 +08:00
写个 dfs … 先睡了
starvedcat
2017-02-26 03:46:45 +08:00
这题很基础,高手应该不太会愿意动手写。本人献丑了

MIN_LENGTH = 2;
MAX_LENGTH = 3;

for (var len = MIN_LENGTH; len <= MAX_LENGTH; len++) {
var word_array = [];
for (var j = 0; j < len; j++) {
word_array[j] = 0
}

while (true) {
var word = '';
for (var k = 0; k < len; k++) {
word += String.fromCharCode(97 + word_array[k]);
}
console.log(word);

for (k = len - 1; k >= 0; k--) {
if (word_array[k] < 25) {
break;
}
}

if (k == -1) {
break;
}

word_array[k]++;
for (k++; k < len; k++) {
word_array[k] = 0;
}
}
}
des
2017-02-26 06:57:20 +08:00
@starvedcat 换我应该会按照一楼说的方式,预先计算 m 到 n 有多少个及总共有多少个,从最小合适的数(如果最少为一位,从零开始)
然后通过类似进制转换的方式进行映射
aheadlead
2017-02-26 07:04:06 +08:00
刚醒
抱歉不是很会写 js
用 python 代替吧

def rich(length):
....alphabet = [chr(_) for _ in range(ord('a'), ord('z')+1)]
....fu = [[], alphabet]
....for i in range(1, length):
........fu.append([c + s for c in alphabet for s in fu[1]])
....return fu
vibbow
2017-02-26 07:07:39 +08:00
@aheadlead python 的缩进......
cyr1l
2017-02-26 07:59:51 +08:00
@aheadlead V2EX 回复不能缩进,看把 python 程序员逼得。
aheadlead
2017-02-26 08:03:00 +08:00
@vibbow @cyr1l 蛤哈原谅我比较懒不想打开 gist
aheadlead
2017-02-26 08:05:59 +08:00
不过上面好像写错了一个地方,不是很懂为什么刚打错了……

def rich(length):
....alphabet = [chr(_) for _ in range(ord('a'), ord('z')+1)]
....fu = [[], alphabet]
....for i in range(1, length):
........fu.append([c + s for c in alphabet for s in fu[i]]) # 在这里
....return fu
hd7771
2017-02-26 08:49:24 +08:00
你这玩意就是 26 进制的数,直接把 10 进制转换成 26 就行了。
wyfyw
2017-02-26 08:54:08 +08:00
@hd7771 不一样,你想想每次都是从 aa 、 aaaa 开始的, 26 进制数显然不是。
kindjeff
2017-02-26 09:08:14 +08:00
@wyfyw 意思是你自己再手写一个进制转换就可以了。
wyfyw
2017-02-26 09:15:47 +08:00
@kindjeff 我的意思是如果只要特定长度的,如长度为 4 , aaaa 可以看作 0000 ,所以是 25 进制。
wyfyw
2017-02-26 09:17:30 +08:00
@kindjeff 我错了。。。就是二十六精致
zhy0216
2017-02-26 09:52:10 +08:00
def hah(length):
....if length == 0: return [[""]]
....return hah(length-1) + [[c+chr(97+i) for c in (hah(length-1)[-1]) for i in range(26)]]
hxsf
2017-02-26 09:57:35 +08:00
zhy0216
2017-02-26 09:58:05 +08:00
忘记加个变量 cache 一下...
def hah(length):
....if length == 0: return [[""]]
....cached = hah(length-1)
....return cached + [[c+chr(97+i) for c in (cached[-1]) for i in range(26)]]
7sDream
2017-02-26 13:09:56 +08:00
xiaoxiuaoliang
2017-02-26 22:16:39 +08:00
@starvedcat 赞~ 将代码适当封装成函数就更棒了,类似 @hxsf 那样
xiaoxiuaoliang
2017-02-26 22:18:32 +08:00
@aheadlead python 基本不了解 哈哈 不过还是非常感谢你的回复,铜币已送上~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343195

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX