📅  最后修改于: 2023-12-03 14:58:24.553000             🧑  作者: Mango
本题来自GATE-CS-2001,题号为38。
给定一个字符串 s
,你需要写出一个程序来检查它是否是由一些子串重复多次组成的。如果是,则返回 True
,否则返回 False
。
例如,字符串abab
是由子串 ab
重复两次组成的,因此返回 True
;字符串 aba
不是由子串重复多次组成的,因此返回 False
。
一个字符串s,s长度不会超过100。
如果s是由重复的子串组成的,则返回 True
,否则返回 False
。
输入:'abab'
输出:True
输入:'aba'
输出:False
看到这道题,第一时间就想到可以用正则表达式解决。用正则表达式来判断字符串是否由子串重复多次组成,需要用到一个神器——正则表达式分组引用来解决。
正则表达式分组引用是指在正则表达式中,用圆括号来将某一部分内容分组,并在整个表达式中按照顺序引用。
好了,先来看正则表达式。如何通过正则表达式判断一个字符串是否是由重复的子串组成的呢?可以用下面这个正则表达式:
^(.+)\1+$
然后我们对这个正则表达式进行一些解释:
^
和 $
表示正则表达式匹配的范围, ^
表示字符串的开始位置, $
表示字符串的结束位置。.+
表示匹配任意字符(除换行符外)的一次或多次重复。\1
表示对分组的引用,它匹配的是第一个分组中的内容。+
表示匹配一次或多次重复,这里是将第一个分组匹配到的内容重复了一次或多次。这个分组就是上面提到的 (.+)
。代码如下:
import re
def repeatedSubstring(s):
if re.match(r'^(.+)\1+$', s):
return True
else:
return False
为了验证我们的代码是否正确,可以使用assert语句来检测正确性。
assert repeatedSubstring('abab') == True
assert repeatedSubstring('aba') == False
本题实际解决的是经典的字符串匹配问题。我们可以用正则表达式或者其他比较简单的方法来解决它。如果你看过 正则表达式30分钟入门教程,就会发现这道题实际上是非常简单的。