来源
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