我正在寻找一个带字符串的函数的帮助,并以各种方式替换该字符串中的每个字符.我不太确定如何说出我的问题,这样才有意义,所以我会告诉你它应该做什么.
stars('1')
returns ['*']
stars('12')
returns ['*1', '1*', '**']
stars('123')
returns ['*23', '1*3', '12*', '**3', '*2*', '**1', '***']
stars('1234')
returns ['*234', '1*34', '12*4', '123*', '**34', '*2*4', '*23*', '1**4', '1*3*',
'12**', '***4', '**3*', '*2**', '1***', '****']
Run Code Online (Sandbox Code Playgroud)
这一切都是手工完成的,但即使我犯了错误,你也应该明白我现在正在寻找什么.最后的情况(所有*)不是必需的,但我把它放在那里以确保问题得到理解.
这是我到目前为止所提出的,但它并没有完全奏效.
def stars(n):
lst = []
length = len(n)
for j in xrange(0, length):
p = list(n)
for k in xrange(j, length):
p[k] = '*'
lst += [''.join(p)]
return lst
Run Code Online (Sandbox Code Playgroud)
输出:
'1' returns ['*']
'12' returns ['*2', '**', '1*']
'123' returns ['*23', '**3', '***', '1*3', '1**', '12*']
'1234' returns ['*234', '**34', '***4', '****', '1*34', '1**4', '1***', '12*4', '12**', '123*']
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.如果可能的话,想用Python解答,但如果你不懂Python,那么伪代码或其他语言是可以接受的.如果它写得很清楚,我相信我可以自己将它转换成Python.
我认为Python中的规范方法是使用itertools模块:
>>> from itertools import product, cycle
>>> s = 'abcde'
>>> [''.join(chars) for chars in product(*zip(s, cycle('*')))]
['abcde', 'abcd*', 'abc*e', 'abc**', 'ab*de', 'ab*d*', 'ab**e', 'ab***',
'a*cde', 'a*cd*', 'a*c*e', 'a*c**', 'a**de', 'a**d*', 'a***e', 'a****',
'*bcde', '*bcd*', '*bc*e', '*bc**', '*b*de', '*b*d*', '*b**e', '*b***',
'**cde', '**cd*', '**c*e', '**c**', '***de', '***d*', '****e', '*****']
Run Code Online (Sandbox Code Playgroud)
然后你可以只扔第一个没有任何星星,但这看起来有点神奇.
如果您不想使用内置的笛卡尔积函数,ISTM还有另外两种方法:您可以使用递归,或者您可以利用您想要打开和关闭每个星的事实,二进制开关.这意味着使用n字母你将有2 ^ n(-1,如果你删除无星形情况)返回的可能性,以及是否在某处放置一个星号对应于数字中的相应位是否设置(例如,'abc'你从1到7循环,1 = 001所以你在最后一个地方放了一颗星,7 = 111所以你到处都放了一颗星等等)
最后一个很容易实现,所以我会留给你.:^)
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |