Python入门习题(67)——OpenJudge百练习题:子串

OpenJudge百练第4018号习题:子串

  • 题目描述
  • 解题思路
  • 参考答案
  • 测试用例
  • 小结

题目描述

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

解题思路

  1. 用递归方法解答本题。递归规律描述如下。

  2. 判断s是否是t的子串的步骤是:从左到右扫描t串的字母,看是否与s串的首字母相同,如果第 i 个字母与s串首字母相同,则判断s’ (s串去掉首字母)是否是t’ (t串去掉前i个字母)的子串的结论就是最终结论。

  3. 用函数sub_str(s, t)来封装判断s是否是t的子串的步骤,那么该函数将调用sub_str(s’, t’)。

  4. 递归函数的函数体内,必须包含递归终止条件。本题中,递归终止条件有:
    (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")

测试用例

  1. 题目描述给出的测试用例有3组。第1组覆盖了是子串的情形。第2组覆盖了不是子串的情形,尽管s中的字母都出现在t中。第3组覆盖了是子串的情形。

  2. 小写字母与大写字母不匹配。
    样例输入
    ab Ab
    样例输出
    No

  3. s串只有1个字母的情形。
    样例输入
    A CA
    样例输出
    Yes

  4. 初看是子串,但实际上不是的情形。
    样例输入
    样例输入1:
    aaabbb abababab
    样例输出:
    No

小结

  1. 本题题解使用了递归函数。形式上看,递归函数是自己调用自己的函数。
  2. 在构造算法的过程中,一旦发现递归规律,就可以考虑采用递归函数。
  3. 递归函数必定包含终止条件。编制递归函数时,要仔细斟酌递归终止条件。

你可能感兴趣的:(Python入门100道习题,Python编程)