嘿,我正在写一个程序,它会从字符串中删除连续的重复字符。
例如:
字符串->aabbccde
第一次迭代: bbccde
第二次迭代: ccde
第三次迭代: de
而德就是答案。
下面是我写的程序。
a = "aabbcs"
def remove_dups(st,ind):
print st, ind
st = st.replace(st[ind], "")
print st, "in dups"
find_dups(st)
def find_dups(text):
s=text
print s, "in find"
ln = len(s)
print ln
fg = 0
ind = 0
if ln==1:
print s, 'len'
return s
for i in range(0,ln-1):
if(s[i]==s[i+1]):
ind = i
remove_dups(s,ind)
print s, 'check'
return s
ans = find_dups(a)
print 'answer', ans下面是我得到的输出
在寻找中
6
aabbcs 0
bbcs在dups中
bbcs在查找
4.
bbcs 0
政务司司长受骗
政务司司长在查找
2
cs检查
bbcs检查
aabbcs 2
dups中的aacs
aacs in find
4.
aacs 0
政务司司长受骗
政务司司长在查找
2
cs检查
aacs检查
aabbcs检查
回答
在这里,我们得到了cs,但仍然是原来的字符串,我可以理解它是因为递归,但无法理解如何解决问题。帮点忙就好了。谢谢!
发布于 2016-11-20 14:03:15
你的线路remove_dups(s,ind)是问题所在。它没有使用返回的值做任何事情。如果您阅读了您的代码,在顶层函数调用中您将在顶部分配s=text,然后在底部返回s,而不会修改s的值。提示是,在打印正确的答案之后,您将在最后打印原始文本。
试试s = remove_dups(s, ind)
发布于 2016-11-20 14:10:03
python有一些更简单的方法可以做到这一点,其中之一是:
>>> dup_string = 'aabcbccde'
>>> from itertools import groupby
>>> ''.join([x for x,y in groupby(dup_string) if sum(1 for i in y)<2])
'bcbde'
>>> dup_string = 'aabbccde'
>>> ''.join([x for x,y in groupby(dup_string) if sum(1 for i in y)<2])
'de'
>>> 发布于 2016-11-20 14:20:25
如果要递归地调用find_dups方法,那么最好去掉for循环。只要找到连续的副本,然后递归地对新返回的字符串调用find_dups即可。
a = "aabbcs"
def remove_dups(st,ind):
return st.replace(st[ind:ind+1], "")
def find_dups(text, i):
if len(text)-1 == i:
return text
if(text[i]==text[i+1]):
text = remove_dups(text,i)
text = find_dups(text, i)
else:
text = find_dups(text, i+1)
return text
ans = find_dups(a, 0)
print "answer", anshttps://stackoverflow.com/questions/40704821
复制相似问题