嘿我正在尝试编写一个程序,它将从字符串中删除连续的重复字符。
例如:
与字符串> aabbccde
第一次迭代:bbccde
第二次迭代:ccde
第三次迭代:de
和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
以下是我得到的输出
aabbcs in find
6
aabbcs 0
bbcs in dups
bbcs in find
4
bbcs 0
cs in dups
cs在找到
2
cs检查
bbcs检查
aabbcs 2
重复的aacs
找到的aacs
4
aacs 0
cs in dups
cs在找到
2
cs检查
aacs检查
aabbcs检查
回答aabbcs
上面我们有cs但仍然回答是原来的字符串,我可以理解它是因为递归,但无法理解如何解决问题。一点帮助将不胜感激。谢谢!
答案 0 :(得分:3)
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'
>>>
答案 1 :(得分:2)
如果你要递归调用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", ans
答案 2 :(得分:1)
您的第remove_dups(s,ind)
行是问题所在。它没有对返回的值做任何事情。如果您仔细阅读了代码,则在顶级函数调用中,您将在顶部分配s=text
,然后在底部返回s
,而无需修改s
的值。线索是,在打印完正确的答案后,最后打印原始文本
试试s = remove_dups(s, ind)
答案 3 :(得分:1)
您可以使用re.sub
import re
str = "aaaabbcccdddx"
print(re.sub(r"(.)\1+", '', str))
<强> OP 强>
x
答案 4 :(得分:1)
您应该返回字符串的值,因为它们是通过副本传递的。此外,一旦完成remove_dups
,您就应该突破,因为您不再对刚修改过的内容感兴趣。
a = "aabbcs"
def remove_dups(st,ind):
print st, ind
st = st.replace(st[ind], "")
print st, "in dups"
return 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
s = remove_dups(s,ind)
break
print s, 'check'
return s
ans = find_dups(a)
print 'answer', ans
答案 5 :(得分:0)
贝娄是你完成这项工作的职责
def remove_duplicates(str):
integer=0
while integer<len(str)-1:
if str[integer]==str[integer+1]:
str=str.replace(str[integer]," ",2)
integer=integer+1
str=str.replace(" ","")
print(str)
你可以包括我遗漏的打印陈述!
答案 6 :(得分:0)
对于常规列表:
mylist = [['a'], ['a'], ['a'], ['b'], ['b'], ['c'], ['d'], ['e'], ['f'], ['a'], ['a']]
idx = 0
while True:
if idx == len(mylist) - 1:
break
if mylist[idx] == mylist[idx + 1]:
del mylist[idx + 1]
idx = idx
else:
idx = idx + 1