Python 查找字符串中重复字符的最长子字符串
(这是研究的基础) 除非我真的,真的,被卡住了,否则我不会在代码部队问题上寻求帮助,而现在正好是 你的第一个任务是找到火星数据库的密码。为了实现这一点,你最好的特工已经发现了以下事实: 密码是由一系列非递减数字组成的给定字符串的子字符串 密码越长越好 密码始终是回文 回文是向后读取相同内容的字符串。racecar、bob和noon就是著名的例子。 鉴于这些事实,你能找到数据库所有可能的密码吗? 输入 第一行包含n,输入字符串的长度(1) ≤ N ≤ 105). 下一行包含长度为n的字符串。这个字符串的每个字符都是一个数字。 字符串中的数字按非降序排列。 输出 在第一行,打印可能的密码数k。 在接下来的k行中,按字母顺序打印可能的密码。 我的意见是:Python 查找字符串中重复字符的最长子字符串,python,string,algorithm,Python,String,Algorithm,(这是研究的基础) 除非我真的,真的,被卡住了,否则我不会在代码部队问题上寻求帮助,而现在正好是 你的第一个任务是找到火星数据库的密码。为了实现这一点,你最好的特工已经发现了以下事实: 密码是由一系列非递减数字组成的给定字符串的子字符串 密码越长越好 密码始终是回文 回文是向后读取相同内容的字符串。racecar、bob和noon就是著名的例子。 鉴于这些事实,你能找到数据库所有可能的密码吗? 输入 第一行包含n,输入字符串的长度(1) ≤ N ≤ 105). 下一行包含长度为n的字符串。这个字
i
上,i的最后一个实例-i+1的第一个实例=重复字符的长度n,s = [input() for i in range(2)]#input
maxlength = 0
results = []
for i in s:
length = (s.rfind(i)-s.find(i))+1
if int(i*(length)) not in results and length>=maxlength:
results.append(int(i*(length)))
maxlength = length
#filer everything lower than the max password length out
results = [i for i in results if len(str(i))>=maxlength]
#output
print(len(results))
for y in results:
print(y)
不幸的是,这个解决方案实际上是错误的,在第四个测试用例中失败了。我不明白代码出了什么问题,所以我无法修复它。有人能帮忙吗
谢谢你的阅读 您的程序将在以下情况下失败:
4
0011
它将只返回11
问题是str(int('00'))
的长度等于1
<>你可以通过删除<代码> int 和<代码> STR 从程序中调用(即将答案保存为字符串而不是INTS)。虽然似乎已经识别出了代码的问题,但是,如果您对解决此问题的不同方式感兴趣,请考虑使用正则表达式。
import sys
import re
next(sys.stdin) # length not needed in Python
s = next(sys.stdin)
repeats = r'(.)\1+'
for match in re.finditer(repeats, s):
print(match.group())
模式()\1+
将查找重复数字的所有子字符串。输入输出
10
3445556788
请注意,匹配的子字符串是从
match
对象中提取的,然后按长度降序排序。代码依赖于这样一个事实,即输入中的数字不得减少,因此不需要第二种字母顺序的候选密码。是b/c失败,生成错误答案,还是b/c耗时太长?您的问题基本上归结为查找给定字符串中长度>1的回文总数。如果我错了,请纠正我,如果可以,请提供一个反例。它失败了,因为它生成了错误的答案。而且,它不仅仅意味着给定字符串中长度大于1的回文,它意味着长度大于等于找到的最长回文。例如,如果我找到一个回文“44”,然后又找到另一个“77777”,我必须丢弃“44”和任何其他较短的回文,因为它不再是最大长度。幸运的是,Peter de Rivas善意地指出问题在于将答案存储为int而不是字符串!
44
555
88
import sys
import re
next(sys.stdin) # length not needed in Python
s = next(sys.stdin).strip()
repeats = r'(.)\1+'
passwords = sorted((m.group() for m in re.finditer(repeats, s)),
key=len, reverse=True)
passwords = [s for s in passwords if len(s) == len(passwords[0])]
if len(passwords) == 0:
passwords = list(s)
print(len(passwords))
print(*passwords, sep='\n')