如何交错或创建两个字符串的唯一排列(无需递归)

2024-04-24

问题是打印两个给定字符串的所有可能的交错。所以我用 Python 编写了一个工作代码,其运行如下:

def inter(arr1,arr2,p1,p2,arr):
    thisarr = copy(arr)
    if p1 == len(arr1) and p2 == len(arr2):
        printarr(thisarr)
    elif p1 == len(arr1):
        thisarr.extend(arr2[p2:])
        printarr(thisarr)
    elif p2 == len(arr2):
        thisarr.extend(arr1[p1:])
        printarr(thisarr)
    else:
        thisarr.append(arr1[p1])
        inter(arr1,arr2,p1+1,p2,thisarr)
        del thisarr[-1]
        thisarr.append(arr2[p2])
        inter(arr1,arr2,p1,p2+1,thisarr)
    return

它出现在字符串中的每个点,然后对于一次递归调用,它认为当前元素属于第一个数组,而在下一次调用中,则认为当前元素属于另一个数组。所以如果输入字符串是ab and cd,它打印出abcd, acbd, cdab, cabd, etc. p1 and p2是指向数组的指针(因为Python字符串是不可变的,所以我使用数组!)。谁能告诉我,这段代码的复杂性是多少,是否可以改进?我编写了类似的代码来打印所有长度组合k从给定的数组:

def kcomb(arr,i,thisarr,k):
     thisarr = copy(thisarr)
     j,n = len(thisarr),len(arr)
     if n-i<k-j or j >k:
        return
     if j==k:
        printarr(thisarr)
        return
     if i == n:
         return
     thisarr.append(arr[i])
     kcomb(arr,i+1,thisarr,k)
     del thisarr[-1]
     kcomb(arr,i+1,thisarr,k)
     return

这也遵循同样的原理。那么一般来说,如何找到此类函数的复杂度,以及如何优化它们? DP可以做这些吗?第一个问题的输入输出示例:

>>> arr1 = ['a','b','c']
>>> arr2 = ['d','e','f']
>>> inter(arr1,arr2,0,0,[])
abcdef
abdcef
abdecf
abdefc
adbcef
adbecf
adbefc
adebcf
adebfc
adefbc
dabcef
dabecf
dabefc
daebcf
daebfc
daefbc
deabcf
deabfc
deafbc
defabc

你的问题可以简化为创建所有unique特定列表的排列。说A and B是字符串的长度arr1 and arr2, 分别。然后构造一个像这样的列表:

[0] * A + [1] * B

从该列表的唯一排列到两个字符串的所有可能的交错,存在一一对应关系(双射)arr1 and arr2。这个想法是让排列的每个值指定从哪个字符串获取下一个字符。下面是一个示例实现,展示了如何从排列构造交错:

>>> def make_interleave(arr1, arr2, permutation):
...     iters = [iter(arr1), iter(arr2)]
...     return "".join(iters[i].next() for i in permutation)
... 
>>> make_interleave("ab", "cde", [1, 0, 0, 1, 1])
'cabde'

I found this http://mail.python.org/pipermail/tutor/2009-December/073567.htmlpython 邮件列表中的问题询问如何有效地解决这个问题。答案建议使用 Knuth 中描述的算法计算机编程艺术,第 4 卷,分册 2:生成所有排列。我找到了一份在线 pdf 草稿here http://www.cs.utsa.edu/%7Ewagner/knuth/fasc2b.pdf。该算法也在本文中进行了描述维基百科文章 http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order.

这是我自己带注释的实现next_permutation算法,作为Python生成器函数。

def unique_permutations(seq):
    """
    Yield only unique permutations of seq in an efficient way.

    A python implementation of Knuth's "Algorithm L", also known from the 
    std::next_permutation function of C++, and as the permutation algorithm 
    of Narayana Pandita.
    """

    # Precalculate the indices we'll be iterating over for speed
    i_indices = list(range(len(seq) - 1, -1, -1))
    k_indices = i_indices[1:]

    # The algorithm specifies to start with a sorted version
    seq = sorted(seq)

    while True:
        yield seq

        # Working backwards from the last-but-one index,           k
        # we find the index of the first decrease in value.  0 0 1 0 1 1 1 0
        for k in k_indices:
            if seq[k] < seq[k + 1]:
                break
        else:
            # Introducing the slightly unknown python for-else syntax:
            # else is executed only if the break statement was never reached.
            # If this is the case, seq is weakly decreasing, and we're done.
            return

        # Get item from sequence only once, for speed
        k_val = seq[k]

        # Working backwards starting with the last item,           k     i
        # find the first one greater than the one at k       0 0 1 0 1 1 1 0
        for i in i_indices:
            if k_val < seq[i]:
                break

        # Swap them in the most efficient way
        (seq[k], seq[i]) = (seq[i], seq[k])                #       k     i
                                                           # 0 0 1 1 1 1 0 0

        # Reverse the part after but not                           k
        # including k, also efficiently.                     0 0 1 1 0 0 1 1
        seq[k + 1:] = seq[-1:k:-1]

该算法的每个产量的摊余复杂度为 O(1),根据this https://stackoverflow.com/questions/4973077/the-amortized-complexity-of-stdnext-permutation问题,但根据下面评论的 rici 的说法,只有所有数字都是唯一的情况才会出现这种情况,而在这种情况下肯定不是这样。

无论如何,收益率的数量提供了时间复杂度的下限,它由下式给出



(A + B)! / (A! * B!)
  

然后,为了找到实时复杂度,我们需要将每个产量的平均复杂度与基于排列构造结果字符串的复杂度相加。如果我们将此总和与上面的公式相乘,我们就得到了总时间复杂度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何交错或创建两个字符串的唯一排列(无需递归) 的相关文章

  • Pythonic方式逐行读取文件?

    以下两种方法中逐行读取文件的 Pythonic 方法是什么 with open file r as f for line in f print line or with open file r as f for line in f read
  • 指向二维数组的指针和手动内存管理 - C

    我认为用纯 C 语言构建一个库来处理各种矩阵计算将是一个很好的挑战 现在 尽管我在 Objective C 和 Cocoa 方面有一些很好的经验 但我对 C 的了解正是我所需要的与 Objective C 一起工作 仅此而已 例如 我熟悉
  • 如何从numpy数组中获取两个最小值

    我想从数组中取出两个最小值x 但是当我使用np where A B np where x x min 0 1 我收到此错误 ValueError 需要超过 1 个值才能解压 我该如何修复这个错误 我需要在数组中按升序排列数字吗 您可以使用n
  • 如何在Python中打印出字母表中的第n个字母?

    ASCII 数学似乎在 Python 中不起作用 一 5 不起作用 如果没有字母数组 如何快速打印出字母表中的第 n 个字母 我天真的解决方案是这样的 letters A B C D E F G H I J K L M N O P Q R
  • 多维数组上的数组合并

    要么我是瞎子 要么我在任何地方都找不到这个问题 昨天我在合并数组时遇到了问题 我可以在 SO 的帮助下解决这个问题 今天 我再次遇到了合并数组的问题 但这一次是多维数组 我有一个数组 usergroup groups 和一个数组 userg
  • 在 PostgreSQL 中获取 JSONB 的精简版本

    如何获取紧凑型JSONB from PostgreSQL 获取时我得到的只是空格 SELECT data FROM a table WHERE id 1 data is JSONB column unique bla bla foo bar
  • 向 list.extend() 传递不可迭代对象

    我正在创建一个公共方法来允许调用者将值写入设备 例如将其称为 write vals 由于这些值将实时输入 因此我希望通过允许用户输入列表或单个值来简化用户的生活 具体取决于他们需要写入的值的数量 例如 write to device 1 2
  • 冻结(.exe)一个traitsUI程序,现实可行吗?

    我正在尝试使用 cx freeze 或 pyInstaller 冻结一个 TraitsUI 程序 该程序利用 Chaco Traits TraitsUI 以及较小程度的 mayavi 实际上可以取出 我需要它在 mac linux ubun
  • Django 1.7.1 需要字段的默认值 - 但数据库中没有条目。为什么?

    我遇到了一个奇怪的问题 我在 Mac OS X Yosemite 上使用 Django 1 7 1 并且配置了本地 MySQL 数据库 通常 我创建一个模型 如果我想添加另一个字段 我只需做一个 manage py migrateDjang
  • 将 csv 写入谷歌云存储

    我试图了解如何将多行 csv 文件写入谷歌云存储 我只是没有遵循文档 https googlecloudplatform github io google cloud python stable storage blobs html hig
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • python 中打印变量和字符串

    好吧 我知道如何打印变量和字符串 但是我如何打印类似 我的字符串 card price 的内容 它是我的变量 我的意思是 这是我的代码 print I have and here I would like to print my varia
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 随机数生成器每次仅返回一个数字

    Python 是否有一个随机数生成器 每次只返回一个随机整数next 函数被调用 数字不应该重复并且生成器应返回区间内的随机整数 1 1 000 000 这是独一无二的 我需要生成超过一百万个不同的数字 这听起来好像非常消耗内存 以防所有数
  • 在函数内部使用时,c 数组大小会发生变化

    我有这段代码 include
  • 第一个字母改为大写

    是否有其他版本可以使每个字符串的第一个字母大写 并且对于 flac perl 也使用 FALSE name lt hallo gsub alpha U 1 name perl TRUE 你可以尝试这样的事情 name lt hallo pa
  • 如何在 Python Paramiko 中配置 ssh StrictHostKeyChecking=no 的等效项

    我正在使用 Paramiko 通过 Python 脚本进行 sshing 我的ssh命令如下 ssh A o strictHostKeyChecking no
  • 使用 PyODBC 选择表中的列名

    我正在编写一个 Python 程序 该程序使用 PyODBC 从 Microsoft Access mdb 文件中选择一些数据 我需要发现几个不同表的列名 在 SQL Server 中 这可以通过使用类似的查询来完成 SELECT c na
  • 将 sudo 与 Python 脚本结合使用

    我正在尝试编写一个小脚本来在每次执行脚本时安装 VirtualBox 共享文件夹 我想用Python 来做这件事 因为我正在尝试学习它来编写脚本 问题是我需要特权才能启动挂载命令 我可以将脚本作为 sudo 运行 但我更喜欢它自己创建 su

随机推荐

  • 在引导响应页面中如何将 div 居中

    我需要使用 bootstrap 将 div 放置在页面的中心来创建响应式页面 如下面提到的布局所示 Bootstrap 5 更新 使用弹性盒进行简单的垂直网格对齐 import url https cdnjs cloudflare com
  • 如何在 shell 函数中获得“set -e”的效果和用处?

    set e 或以 bin sh e 对于出现问题时自动轰炸非常有用 它使我不必对每个可能失败的命令进行错误检查 如何在函数内获得与此等效的内容 例如 我有以下脚本 该脚本在出现错误时立即退出 并显示错误退出状态 bin sh e echo
  • 根据内部数组中的值对外部数组进行排序,javascript

    我有一个包含数组的数组 我想根据内部特定列中的值对外部数组进行排序 我敢打赌这听起来有点令人困惑 所以我将直接跳到一个例子 初始数据 var data row 1 col1 2 row 1 col2 c row 1 coln row 2 c
  • 分析跟踪新 Web+App 中的自定义事件

    我曾经使用以下命令跟踪自定义事件 API 命中 google analytics and PHP via cURL 但现在分析正在弃用这种方法 我知道新的分析 Web App 用于跟踪此类事件 但我找不到任何可以让我跟踪这些事件的东西 我当
  • React Native项目没有index.ios.js或index.android.js

    你好 我是 React Native 的新手 我按照下面的链接构建了我的第一个项目 但发现没有 index ios js 或 index android js 可供我编辑 https facebook github io react nat
  • 如何在gnuplot中绘制带有彩色边框的矩形

    我想在我的图中画一个空矩形 到目前为止我有 set style rect back fs empty border lt 3 set object 1 rect from 1 1 to 2 2 我有一个带有虚线的矩形 如何更改线条的颜色 l
  • F# 中的异步 EF 查询

    在使用 EF6 的 C 中 我可以轻松地进行如下异步操作 using var context new MyDbContext var item await context SomeEntities Where e gt e Id 1 Fir
  • 如何在窗口窗体中制作圆形标签?

    众所周知 标签通常是正方形或长方形 我真的需要制作圆形标签 谁能告诉我这是否可能 或者至少为我指出正确的方向 抱歉 只是为了把事情说清楚 我想要一个圆形标签 不仅仅是在屏幕上画一个圆圈 您可以设置 Label 的 Region 属性 var
  • 在 CentOS 6.4 中意外删除了符号链接 libc.so.6。如何获得 sudo 权限来重新创建它?

    我不小心删除了符号链接 lib64 libc so 6 gt lib64 libc 2 12 so sudo rm libc so 6 然后我不能使用任何东西 包括ls命令 我输入的任何命令都会出现错误 ls error while loa
  • 如何使用 USPS 验证给定地址?

    我想向 USPS 验证给定的地址 地址 城市 州 邮政编码 如果提供的地址是有效地址 则返回结果 如果不是有效地址 则返回无效地址 那么我怎样才能在 C Net 中做到这一点呢 美国邮政服务 USPS 通过其地址信息 API 提供此服务 U
  • 扁平按钮与凸起按钮

    我想知道之间的基本区别Flat button and Raised Button 根据新Android材料设计指南 我想使用凸起按钮 但我不知道它们是什么 网络上有一些论坛显示一个凸起的按钮 但他们称之为 扁平 谁能告诉我两者之间的基本区别
  • Android 找不到类异常

    我正在使用两个单独的类 其中一个有一些按钮 另一个打开谷歌地图 我正在其上进行覆盖 如果有人能看到我打开 Map class 的意图的问题 请告诉我 我将输入我的错误消息和代码 package com state park import j
  • ORM 是用于迁移数据的正确工具吗?

    背景 我们正在升级旧版导入工具 它的作用是将数据从连接到 SQL Server 的一个数据库移动到同一服务器上的第二个数据库 并使用不同的模式沿途执行转换和映射 这是一个帮助解释正在发生的事情的示例 假设源数据库有一张表名为Client I
  • Java - 点在线

    我如何找出点 x y 是否位于其他两个点之间创建的线上 我尝试了这个 但似乎有些问题 因为我没有得到我应该得到的结果 public boolean intersects Point k Point z Point p Line2D line
  • Jackson 或 JAXB,哪一个更适合 JSON? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道 JSON Jackson 或 JAXB 哪一个更好 我做了一些研究 我知道 也许我错了 我们不应该使用 JAXB 来转换 JSON 某
  • 比较当前月份和上个月的列上的行,SQL Server 2012

    我需要一些指导和帮助来解决我不完全确定如何在 SQL Server 2012 中解决的问题 我认为LAG and LEAD函数可能有用 但我不确定 这就是我的数据现在的样子 YearMonth LocationCode Active 201
  • 是否可以使用文件名模式创建 blob 触发的 azure 函数?

    我正在开发一个 blob 触发的 azure 函数 以下是我的 function json 文件的配置 disabled false bindings name myBlob type blobTrigger direction in pa
  • 如何在 CKEditor 中更改已注册的对话框

    我正在尝试编写一个插件 向图像对话框添加一个附加选项卡 页面 我不想更改对话框的源本身 而是使用插件来增强它 我搜索文档和论坛已经有一段时间了 现在我知道我可以在对话框对象上调用 addPage 来添加另一个选项卡 我也了解内容对象必须是什
  • 识别 Pandas 数据框中组中重复项的更好方法? [复制]

    这个问题在这里已经有答案了 我有一个数据框 x c 0 0 1 1 3 2 2 1 1 3 2 1 4 3 1 5 4 1 6 1 0 7 3 1 8 2 1 9 1 2 我想生产 c x duplicated 0 1 0 False 1
  • 如何交错或创建两个字符串的唯一排列(无需递归)

    问题是打印两个给定字符串的所有可能的交错 所以我用 Python 编写了一个工作代码 其运行如下 def inter arr1 arr2 p1 p2 arr thisarr copy arr if p1 len arr1 and p2 le