Python:每日一题之《消除游戏》真题练习

问题描述

在一个字符串 S 中, 如果 Si​=Si−1​ 且 Si​!=Si+1​, 则称 Si​ 和 Si+1​ 为边缘 字符。如果 Si​!=Si−1​ 且 Si​=Si+1​, 则 Si−1​ 和 Si​ 也称为边缘字符。其它的字符 都不是边缘字符。

对于一个给定的串 S, 一次操作可以一次性删除该串中的所有边缘字符 (操作后可能产生新的边缘字符)。

请问经过 264 次操作后, 字符串 S 变成了怎样的字符串, 如果结果为空则 输出 EMPTY。

输入格式

输入一行包含一个字符串 S。

输出格式

输出一行包含一个字符串表示答案,如果结果为空则输出 EMPTY。

样例输入 1

样例输出 1

EMPTY

样例输入 2

sdfhhhhcvhhxcxnnnnshh

样例输出 2

s

评测用例规模与约定

对于 25% 的评测用例, ∣S∣≤10^3, 其中 ∣S∣ 表示 S 的长度;

对于 50% 的评测用例, ∣S∣≤10^4;

对于 75% 的评测用例, ∣S∣≤10^5;

对于所有评测用例, ∣S∣≤10^6,S 中仅含小写字母。

运行限制

  • 最大运行时间:5s
  • 最大运行内存: 512M

思路:

因此直接模拟字符串的变化,根据题目定义,执行 264264 次操作相当于无限次操作。但是在某次消除之后不会发生改变,即找不到边缘字符,此时即可停止循环。

  • 每次消除时,根据题目定义的边缘字符进行查找,将查找的下标进行标记。
  • 每次将边缘字符消除,然后进入下一次操作

注意:标记数组每次操作需要重新初始化,但是每次初始化的长度可以仅为当前字符串的长度,这样可以节约时间。

参考代码:

s=list(input())
height=0
while True:
  a=len(s)
  vis=[0]*a
  if a==0:
    print('EMPTY')
    break
  if height==a:
    print(''.join(s))
    break
  for i in range(a):
    if (i-1)>=0 and (i+1)<a and s[i]==s[i-1] and s[i]!=s[i+1]:
      vis[i]=vis[i+1]=1
    if (i-1)>=0 and (i+1)<a and s[i]!=s[i-1] and s[i]==s[i+1]:
      vis[i-1]=vis[i]=1
  lis=[]
  for i in range(a):
    if vis[i]==0:
      lis.append(s[i])
  s=lis
  height=a

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值