求一则算法(python)
罗列出qwerty
被.
分割的所有情况:
q.werty q.w.erty qw.erty ... q.w.e.r.t.y
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
罗列出qwerty
被.
分割的所有情况:
q.werty q.w.erty qw.erty ... q.w.e.r.t.y
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
楼主 这个问题其实不难,首先肯定的是“点”是存在于两个字母之间的 ,那么你就想象有n个“位置”在n+1个字母之间,每一个“位置”有两个状态,一个是存在“点”,一个是不存在“点”,都不存在的情况被排除掉了,所以本题的核心是求集合的非空子集。所有的可能性的个数为 2^n - 1
假设 字符串为qwer,那么有三个“位置”,我们把这个三个“位置”分别命名为a,b,c
那个通过循环和二进制位的判断可以得出所有的结果
楼主静下心来看看下面的结果,悟一下,算法的复杂度还是蛮低的
index从 1 到 2^n-1 (<=) 循环,每一步判断当前index中二进制位为1对应的位,然后将"点"放到相应的位置,下面的例子当到2^3-1也就是7的时候,三个“位置”上都放上了“点”
我自己之前写过一个SKU相关的算法,其实本质和这个问题是一样的,可以参见 http://geeklu.com/2012/09/sku/
具体的实现:
如果你想看下实现原理: 我这里有个C版的,更清楚些:
http://hit9.org/blog/Data_Structures_... 的第2题
--------------- 10-25更新-----------
好吧.比较简短的版本来了:
下面的属于比较'不那么麻烦的做法'~ 用了itertools模块:
来个5行简单版
//效率灰常低,纯属玩玩。。
p.s. 针对"abcde"字符串的排列
某男的ruby(1.9.x)精简版:
简单地说就是笛卡尔积,至于看不看得懂是另一回事了……(反正我没看太懂,ruby语法太抽象。。)
某男的C精简版:
与hit9同学协力完成了个(易读易写的)
写了个周期性交互插入的函数riffle,模仿的是Mathematica的一个内置函数,
注意,sum(.., ())的写法简洁但是低效.
Mathematica code(可以在www.mathics.net在线运行):