Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >生成所有可能的有序字符串排列

生成所有可能的有序字符串排列
EN

Stack Overflow用户
提问于 2020-01-10 17:19:43
回答 2查看 627关注 0票数 1

我是在面试时被问到这个问题的。我一直在想这件事,但却找不到解决办法。

问题是:您知道密码只由字母和有序组成,这意味着密码中的字符是按字母顺序排列的。

例如,4位密码可以是"abxz“或"aBkZ”,而不是"aAxz“或"baxz”。

编写一个函数,生成所有给定长度的有效密码。不要忘记,它必须生成所有可能的组合与上和下字符。例:"aBcd“、"Abcd”、"abcd“、"AbCd”都是不同的有效密码。

我认为算法必须是递归的。然而,到目前为止,一切都不起作用。我试过以下几种方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(number, start_letter ='A',  match = ''):
    if number == 0:
        print(match)
    else:
        for i in range(ord(start_letter), 70):
            func(number-1, chr(ord(start_letter)+1),match + chr(i))    

求你了,把我从痛苦中拯救出来。

编辑:我不会批准使用迭代工具的解决方案。我认为其他解决方案不那么依赖于语言,而且可以很容易地用其他语言编写。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-10 17:36:02

递归在这里效果很好。选择一个起始字母,只从剩下的字母中迭代,在大写和小写中递归,并在整个过程中将起始字母向上推。基本情况是,当我们构建的字符串的长度与目标长度相同时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def all_alphabetical_pw(length, start=65, pw=""):
    if len(pw) == length:
        yield pw
    else:
        for i in range(start, 91):
            yield from all_alphabetical_pw(length, i + 1, pw + chr(i))
            yield from all_alphabetical_pw(length, i + 1, pw + chr(i).lower())

if __name__ == "__main__":
    pws = list(all_alphabetical_pw(4))
    print(len(pws), "\n")

    for pw in pws[:10]: 
        print(pw)

    print("...")

    for pw in pws[-10:]: 
        print(pw)

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
239200

ABCD
ABCd
ABCE
ABCe
ABCF
ABCf
ABCG
ABCg
ABCH
ABCh
...
WxyZ
Wxyz
wXYZ
wXYz
wXyZ
wXyz
wxYZ
wxYz
wxyZ
wxyz
票数 1
EN

Stack Overflow用户

发布于 2020-01-10 18:19:22

使用itertools,可以找到与@ggorlen相同的239200个字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from string import ascii_uppercase
from itertools import combinations, product

def all_alphabetical_pw(length):
    for c in combinations(ascii_uppercase, length):
        for p in product(*zip(c, map(str.lower, c))):
            yield ''.join(p)

还有一个变体,不知道我更喜欢哪一个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def all_alphabetical_pw(length):
    for c in combinations(zip(ascii_uppercase, ascii_lowercase), length):
        for p in product(*c):
            yield ''.join(p)

这两种方法都是通过产生像(('D', 'd'), ('I', 'i'), ('N', 'n'), ('O', 'o'))这样的组合,然后是他们的产品,给出像('D', 'i', 'n', 'O')这样只需要加入的元组。只有当我把'D'这样的字母转换成像('D', 'd')这样的对子时,这两种解决方案才会有所不同。

第一个版本是在生成像('D', 'I', 'N', 'O')这样的组合之后进行的,将每个这样的组合转换成(上、下)对的组合。

第二个版本在生成组合之前就这样做了,而是为整个字母表构建了一次对。这更有效率,而且看起来更干净。好的,我现在更喜欢这个。

基准:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ggorlen's  0.199 seconds
my first    0.094 seconds
my second   0.072 seconds

测量结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
timeit(lambda: list(all_alphabetical_pw(4)), number=100) / 100

哦,再来一次。它需要0.056秒,所以它是最快的,但我不太喜欢它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def all_alphabetical_pw(length):
    for c in combinations(zip(ascii_uppercase, ascii_lowercase), length):
        yield from map(''.join, product(*c))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59690859

复制
相关文章
java 输出字符串的所有排列_Java程序打印字符串的所有排列
static void print_permutations(String my_str,String my_ans){
用户7886150
2021/04/29
1.1K0
字符串所有排列组合暴力递归
给你一个字符串"acb",可以打印出六种排列组合,这里又是一种index推动的递归,但是这里有一些小trick,就是从第一个开始,在后面的字符串的每一个字符进行交换,这样就可以省很多空间,在数组内原地交换,遍历到每一个字符上也有很多细节,将后面的每一个字符和当前字符进行交换,并且每次遍历完一个,这个字符就不要在动了,随后再还原现场。
gzq大数据
2021/11/24
6290
排列组合公式的原理_有序排列组合公式
绪论:加法原理、乘法原理# 分类计数原理:做一件事,有n类办法,在第1类办法中有m1种不同的方法,在第2类办法中有m2种不同的方法,…,在第n类办法中有mn种不同的方法,那么完成这件事共有N=m1+m2+…+mn种不同的方法。
全栈程序员站长
2022/11/01
1.9K0
插入有序的单链表(要求插入后元素有序排列)
某校实验室有一批计算机,按其价格从低到高的次序构成了一个单链表存放,链表中每个结点指出同样价格的若干台。现在又增加m台价格为h元的计算机,编程实现实验室计算机单链表中增加计算机的算法。
别团等shy哥发育
2023/02/27
6560
插入有序的单链表(要求插入后元素有序排列)
字符串的排列(全排列问题)
输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
名字是乱打的
2022/05/13
5040
字符串的排列(全排列问题)
按字典序打印字符串中字符的所有排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
名字是乱打的
2022/05/13
1.4K0
[剑指offer] 字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
尾尾部落
2018/09/04
7440
字符串的排列
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
3370
字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a, b, c 所能排列出来的所有字符串 abc, acb, bac, bca, cab 和 cba。
MickyInvQ
2022/05/06
1810
字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 
用户3003813
2018/09/06
4230
字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。 求整个字符串的排列,可以看成两步: 首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。下图就是分别把第一个字符a和后面b、c等字符交换的情形。 第二步固定第一个字符(如图a所示),求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐
猿人谷
2018/01/17
6890
字符串的排列
字符串排列
【原题】 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 【思路
用户1148830
2018/01/03
7860
LeetCode - 所有可能的路径
我又重新开始更新LeetCode了,以后工作日更新LeetCode,周末更新东野圭吾的小说
晓痴
2019/07/24
7490
LeetCode - 所有可能的路径
成为大师,是掌握了所有秩序之后的一种可能|混沌和有序
最近听了一个关于学习的演讲,对互联网时代的学习模式又有了新的认知,自己也一直思考相关的问题,我们该如何建立自己的学习系统。
吾非同
2020/10/26
3030
成为大师,是掌握了所有秩序之后的一种可能|混沌和有序
采用递归生成排列
话不多说,代码如下: #include<iostream> using namespace std; inline void Swap(int &a, int &b) { int temp = a; a = b;; b = temp; } void Perm(int list[], int begin, int end) { if (begin == end) { for (int i = 0; i <= end; i++) {
杨鹏伟
2020/09/10
3330
字符串排列_27
回朔法其实是在构造一棵生成树。对于"abc",第一个位置有三种取值,第二个位置有两种取值,第三个位置有一种取值。
名字是乱打的
2021/12/23
2000
字符串排列_27
字符串的全排列(java)
       字符串全排列相信大家都不陌生,对于我来说真的是写了又忘,忘了又写,所以决定写成一篇博客,废话不多说下面我来分析问题:
actionzhang
2022/11/30
6710
LeetCode:所有可能的路径_797
给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)
Yuyy
2022/06/28
3430
LeetCode:所有可能的路径_797
567. 字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。 换句话说,第一个字符串的排列之一是第二个字符串的 子串 。 示例 1: 输入: s1 = "ab" s2 = "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba"). 示例 2: 输入: s1= "ab" s2 = "eidboaoo" 输出: False class Solution { public boolean checkInclusion(Str
CaesarChang张旭
2021/06/21
2930
点击加载更多

相似问题

生成所有可能的排列

321

生成给定字符串的有序排列

13

Java生成字符串的所有可能的排列

20

生成字符串的所有可能排列的列表

351

生成Ruby中所有可能的字符串排列

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文