递归删除所有相邻重复项的Python程序
给定一个字符串,递归地从字符串中删除相邻的重复字符。输出字符串不应有任何相邻的重复项。请参阅以下示例。
例子:
Input: azxxzy
Output: ay
First “azxxzy” is reduced to “azzy”.
The string “azzy” contains duplicates,
so it is further reduced to “ay”.
Input: geeksforgeeg
Output: gksfor
First “geeksforgeeg” is reduced to
“gksforgg”. The string “gksforgg”
contains duplicates, so it is further
reduced to “gksfor”.
Input: caaabbbaacdddd
Output: Empty String
Input: acaaabbbacdddd
Output: acac
可以按照以下方法在O(N)时间内删除重复项:
- 从最左边的字符开始,如果有的话,删除左角的重复项。
- 第一个字符现在必须与其相邻字符不同。重复长度为 n-1 的字符串(没有第一个字符的字符串)。
- 令长度为 n-1 的右子串减少后得到的字符串为rem_str 。有三种可能的情况
- 如果rem_str的第一个字符与原始字符串的第一个字符匹配,则从rem_str中删除第一个字符。
- 如果剩余字符串为空并且最后删除的字符与原始字符串的第一个字符相同。返回空字符串。
- 否则,将原始字符串的第一个字符附加到rem_str的开头。
- 返回rem_str 。
下图是上述方法的试运行:
下面是上述方法的实现:
Python
# Python program to remove all
# adjacent duplicates from a string
# Recursively removes adjacent
# duplicates from str and returns
# new string. las_removed is a
# pointer to last_removed character
def removeUtil(string, last_removed):
# If length of string is 1 or 0
if len(string) == 0 or len(string) == 1:
return string
# Remove leftmost same characters
# and recur for remaining
# string
if string[0] == string[1]:
last_removed = ord(string[0])
while len(string) > 1 and
string[0] == string[1]:
string = string[1:]
string = string[1:]
return removeUtil(string, last_removed)
# At this point, the first
# character is definiotely different
# from its adjacent. Ignore first
# character and recursively
# remove characters from remaining string
rem_str = removeUtil(string[1:],
last_removed)
# Check if the first character
# of the rem_string matches
# with the first character of
# the original string
if len(rem_str) != 0 and
rem_str[0] == string[0]:
last_removed = ord(string[0])
return (rem_str[1:])
# If remaining string becomes
# empty and last removed character
# is same as first character of
# original string. This is needed
# for a string like "acbbcddc"
if len(rem_str) == 0 and
last_removed == ord(string[0]):
return rem_str
# If the two first characters of
# str and rem_str don't match,
# append first character of str
# before the first character of
# rem_str.
return ([string[0]] + rem_str)
def remove(string):
last_removed = 0
return toString(removeUtil(toList(string),
last_removed))
# Utility functions
def toList(string):
x = []
for i in string:
x.append(i)
return x
def toString(x):
return ''.join(x)
# Driver program
string1 = "geeksforgeeg"
print remove(string1)
string2 = "azxxxzy"
print remove(string2)
string3 = "caaabbbaac"
print remove(string3)
string4 = "gghhg"
print remove(string4)
string5 = "aaaacddddcappp"
print remove(string5)
string6 = "aaaaaaaaaa"
print remove(string6)
string7 = "qpaaaaadaaaaadprq"
print remove(string7)
string8 = "acaaabbbacdddd"
print remove(string8)
string9 = "acbbcddc"
print remove(string9)
# This code is contributed by BHAVYA JAIN
输出:
gksfor
ay
g
a
qrq
acac
a
时间复杂度:解决方案的时间复杂度可以写为 T(n) = T(nk) + O(k) 其中 n 是输入字符串的长度,k 是相同的第一个字符的数量。递归的解是 O(n)
感谢Prachi Bodke提出这个问题和初步解决方案。
有关详细信息,请参阅有关递归删除所有相邻重复项的完整文章!