前言:
这道题并不是我自己一个人想出来的,我只是在诸位大佬的思路下解出这道题。
这道题想了2天,网络上也没有题解,使用模拟,或者set集合进行解题都会超时。
多谢 高天大哥,西电爷给的思路,在他们的思路下我对代码进行了细化最终全部测试用例通过。
解题思路:
1. 将字符合并成节点
例如:
aaaabbbbcccc
合并成
(a, 4), (b, 4), (c, 4) 注意,这里不是元组是链表节点的属性,第一个代表字符,第二个代表长度。
2. 遍历链表每个节点
3. 当节点size大于等于2时左右节点 -1 ,当前节点 - 2
4. 合并节点,当一个节点size <= 0 时被丢弃
代码
class ListNode:
def __init__(self, char=None, size=0):
self.char = char
self.size = size
self.next = None
self.pre = None
self.right = False
self.left = False
def __str__(self):
return "(Char: %s, Size: %s, Left: %s, Right: %s)" % (self.char, self.size, self.left, self.right)
__repr__ = __str__
s = input()
n = len(s)
idx = 0
head = ListNode() # 头节点哨兵
node = head
# 初始化链表
while idx < n:
cnt = 1 # size
while idx + 1 < n and s[idx] == s[idx + 1]: # 判断有无连续字符
idx += 1
cnt += 1
cur = ListNode(s[idx], cnt)
node.next = cur
cur.pre = node
node = cur
idx += 1
def delete_node(node):
pre = node.pre
cur = node.next
# 只剩一个头节点了 且为连续字符
if node.pre == head and not node.next:
return False
# 头节点,且不唯一
elif node.pre == head and node.next:
cur.size -= 1 if not cur.left else 0
cur.left = True if not cur.left else True
node.size -= 1 if not node.right else 0
node.right = True if not node.right else True
return True
# 中间节点
elif node.pre and node.next:
pre.size -= 1 if not pre.right else 0
pre.right = True if not pre.right else True
cur.size -= 1 if not cur.left else 0
cur.left = True if not cur.left else True
node.size -= 1 if not node.left else 0
node.size -= 1 if not node.right else 0
node.left = True if not node.left else True
node.right = True if not node.right else True
return True
# 尾节点
elif not node.next:
pre.size -= 1 if not pre.right else 0
pre.right = True if not pre.right else 0
node.size -= 1 if not node.left else 0
node.left = True if not node.left else True
return True
# 程序有问题
else:
print("什么情况?")
return False
def merge_list_node(head):
node = head
while node:
cur = node.next
while cur and cur.size <= 0:
cur = cur.next
if cur and cur.char == node.char: # 合并同类型,遇到相同的 char 合并它们的 size
node.size += cur.size
cur.size = 0
node.next = cur
node.left, node.right = False, False
if cur is not None:
cur.pre = node
cur.left, cur.right = False, False
node = cur
flag = True
while flag:
flag = False # 用来判断是否字符是否最简化了
star = head.next
while star:
if star.size >= 2 or (star.left and star.size + 1 >= 2):
# 进行删除
flag = delete_node(star)
star = star.next
# f(head)
merge_list_node(head)
p = head.next
ans = ""
while p:
ans += p.char * p.size
p = p.next
print(ans) if ans != "" else print("EMPTY")
测试用例:
""" 第一行输入 第二行答案 aaaaaaaaaaaaaaaaaaaaednecjkmlwidqdgpeiwzzzzzzzzzzzzzzyfknziqvbxkcfffffffffffffffeuflcloprejfqaaaaaaaaaaaafhfasthuafuuuuuuuuuuuuuuuuuuwauydwprcpgawtvbeeeeeeeeeeeetymnbxuipjcwshmvipeywvmditzrqvavugtvstj aipeywvmditzrqvavugtvstj mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllllllllllllllllllllllllllllllllllllllllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuujjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb mmmmmmmmm mmmmaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssooooooooooooooooooooooooooottttttttllllllllllxxxxxxxxxxwwwwwwwwdddddddddduuuuuuuuuuuuuuuuuuuuuuuuuuyyyyyykkkkssssssssssvvvvvvmmmmmmmmnnnnnnnnnneeeeeeeeeeeeeeeeeeeeeeeeeeeeerrrrrrrrrrrrrrrrrrrrrrrrrrffffffffccccccttttttttaaaaaajjjjjjddddddddddddddddddddddddddggggggggggggggggggjjjjjjjjjjggggggggggoooooooooooooooooooooooooooooonnnnnddddddddddkkkkkkppppppwwwwwwllllllllllrrrrrraaaaaaaaaaammmmmmmmmmmmmmmmmmmmmmmggggwwwwwwwwwwvvvvvvggggggggyyyyyyffffffffffffffffffffffffffffffdddddddbbbbbbbbbbbbbbbbbbbbbbyyyyyyyytttt aaaaaaa """
总结:
在这次真题的思考中我明白了一件事,力扣刷多了并不代表我很强,我刷蓝桥杯一样会被暴捶,我会继续学习,继续努力的。