📜  门| GATE-CS-2001 |第 38 题(1)

📅  最后修改于: 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分钟入门教程,就会发现这道题实际上是非常简单的。