题目描述
来源
OpenJudge网站 – 百练习题集-第4018号习题
要求
总时间限制: 1000ms 内存限制: 65536kB
描述
字符串s和t均由字母组成,若在t中除去一些字母能够得到s,我们就说s是t的一个子串。比如abc就是acbefc的子串
(acbefc去掉第二、第四、第五个字符后就得到abc)
输入
有若干组输入数据,每组一行,分别为字符串s和t,s与t之间用空格隔开
输出
对于一组s与t,若s是t的子串,则输出Yes,否则输出No
样例输入
sequence subsequence
abc acb
VERDI vivaVittorioEmanueleReDiItalia
样例输出
Yes
No
Yes
解题思路
-
用递归方法解答本题。递归规律描述如下。
-
判断s是否是t的子串的步骤是:从左到右扫描t串的字母,看是否与s串的首字母相同,如果第 i 个字母与s串首字母相同,则判断s’ (s串去掉首字母)是否是t’ (t串去掉前i个字母)的子串的结论就是最终结论。
-
用函数sub_str(s, t)来封装判断s是否是t的子串的步骤,那么该函数将调用sub_str(s’, t’)。
-
递归函数的函数体内,必须包含递归终止条件。本题中,递归终止条件有:
(1)t串中的所有字母与s串的首字母都不相同——结论是s不是t的子串。
(2)s串的长度大于t串的长度——结论是s不是t的子串。
(3)s串为空,表明s中所有字母都已经匹配——结论是s是t的子串。
参考答案
#sstr是tstr的子串吗?
def sub_str(sstr, tstr):
if len(sstr) == 0: #s为空
return True #所有字母都已经匹配完毕
if len(sstr) > len(tstr):
return False #s串的长度大于t串的长度
for index, t in enumerate(tstr):
if t == sstr[0]:
return sub_str(sstr[1:], tstr[index + 1:]) #递归函数
return False #t中所有字母都不等于s的首字母
import sys
for line in sys.stdin: #在键盘上按Ctrl + D或Ctrl + Z表示输入结束
sstr, tstr = line.split()
if sub_str(sstr, tstr):
print("Yes")
else:
print("No")
测试用例
-
题目描述给出的测试用例有3组。第1组覆盖了是子串的情形。第2组覆盖了不是子串的情形,尽管s中的字母都出现在t中。第3组覆盖了是子串的情形。
-
小写字母与大写字母不匹配。
样例输入
ab Ab
样例输出
No -
s串只有1个字母的情形。
样例输入
A CA
样例输出
Yes -
初看是子串,但实际上不是的情形。
样例输入
样例输入1:
aaabbb abababab
样例输出:
No
小结
- 本题题解使用了递归函数。形式上看,递归函数是自己调用自己的函数。
- 在构造算法的过程中,一旦发现递归规律,就可以考虑采用递归函数。
- 递归函数必定包含终止条件。编制递归函数时,要仔细斟酌递归终止条件。

本文详细解析了如何通过递归方法判断一个字符串是否为另一个字符串的子串,提供了Python实现的示例代码,并通过测试用例验证算法的有效性。
——OpenJudge百练习题:子串&spm=1001.2101.3001.5002&articleId=104543923&d=1&t=3&u=c95217513bb043298d013634532468f6)
3794

被折叠的 条评论
为什么被折叠?



