如何递归删除使用python重复3次或更多次的所有相邻字符

时间:2018-02-20 12:18:17

标签: python

测试用例      输入:abbbaaccada      输出:ccada      输入:bbccdddcb      输出:(空字符串)

str = input("Enter string: ")

def my_string(string):
    if not string:
    return ""
    if len(string) == 1:
       return string
    if string[0] == string[1] == string[2]:
       return my_string(string[3:])
    return string[0] + my_string(string[1:])

print (my_string(str))

我是python的新手。而我正在尝试删除字符串中连续出现3个或更多字符的字符。在这里,我只能得到只有1次迭代的输出。例如i / p- hhhelllo o / p-eo但是对于i / p- abbbaaccada o / p是aaaccada但它应该是ccada ..请帮助..

我做了这个直到3次重复,但是如何将它推广超过3次重复。??

2 个答案:

答案 0 :(得分:3)

您的问题提供了展示else循环中的for如何有用的机会。看看:

def remover(my_str):
    temp = set(my_str)
    while True:
        for c in temp:
            if 3*c in my_str:
                my_str = my_str.replace(3*c, '')
                break
        else:
            break
    return my_str


test1 = 'abbbaaccada'
print(remover(test1))  # -> ccada

test2 = 'i/p- hhhelllo'
print(remover(test2))  # -> i/p- eo

如果您坚持进行递归调用,可以按如下方式修改上述内容:

def remover(my_str):
    temp = set(my_str)
    new_str = my_str
    for c in temp:
        if 3*c in new_str:
            new_str = new_str.replace(3*c, '')
    if my_str == new_str:
        return new_str
    else:
        return remover(new_str)

答案 1 :(得分:1)

我添加了一个可以重复3次或更多次的解决方案,因为上述解决方案对我不起作用。这是一种递归解决方案。

import re

def format_string(u_str):
    f_str = remove_string(u_str)

    if f_str == u_str:
        return f_str
    else:
        return format_string(f_str)

def remove_string(u_str):
    index = 0  # This will maintain the index while traversing the entire string
    while index < len(u_str):
        r = re.search(u_str[index]*4 + '*', u_str)

        if r:
            start, end = r.span()  # start and end index of substring matching 3 or more repetition
            u_str = u_str[:start] + u_str[end:]  # removing the found substring
            index = end
        else:
            index += 1
    return u_str

test1 = 'abbbaaccada'
print('output:' + format_string(test1))

test2 = 'bbccdddcb'
print('output:' + format_string(test2))