666999666999 发表于 6 天前

关于python课后作业33讲动动手答案的疑问

下面的图片是题目

这是答案代码
s = input("请输入字符串s:")
t = input("请输入字符串t:")
   
n = len(s)
m = len(t)
   
j = k = 0
while j < n and k < m:
    if s == t:
      j += 1
    k += 1
   
if j == n:
    print("字符串 s 是字符串 t 的子序列。")
else:
    print("字符串 s 不是字符串 t 的子序列。")
如果输入的字符串s是:sjjk
出入的字符串t是:sjjjjjssskkkkk
最后代码的结果还是字符串s是字符串t的子序列,这里是不是有个bug呢?{:13_459:}

不二如是 发表于 6 天前

不是bug哦~~

这个结果是正确的。

“子序列” (subsequence) 的定义就是:

只要求顺序一致,不要求字符连续。
在 t 中依次能找到 s 的每个字符,并且索引逐渐往后走即可。

FishC 发表于 6 天前

关于子序列判断代码的疑问,我来详细解释一下:

原代码确实存在两个关键问题:

1. 错误比较整个字符串:代码中写的是 if s == t,这会导致比较整个字符串而非逐个字符比较
2. 逻辑有缺陷:即使修正比较逻辑,当s="sjjk"、t="sjjjjjssskkkkk"时,程序会错误判断为子序列(实际不是)

修正后的正确代码:

s = input("请输入字符串s:")
t = input("请输入字符串t:")
   
n = len(s)
m = len(t)
   
j = 0# 指向s的指针
for char in t:# 遍历t的每个字符
    if j < n and s == char:# 关键修正点:比较字符而非整个字符串
      j += 1
   
if j == n:
    print("字符串 s 是字符串 t 的子序列。")
else:
    print("字符串 s 不是字符串 t 的子序列。")

问题分析(以s="sjjk", t="sjjjjjssskkkkk"为例):
1. 正确逻辑要求:必须按顺序匹配 s='k',且该k必须在第二个j之后
2. 原代码错误:
   - 当匹配到 t='j'(第三个字符)时,已匹配完s的前三个字符(s's', s'j', s'j')
   - 但s='k'实际出现在t的第10个位置(sjjjjsss...)
   - 由于t中第3-9位都是j/s,没有k,因此不满足子序列条件

这个修改后的代码能正确处理:
1. s="abc" t="a-b-c" → 是子序列
2. s="axc" t="a-b-c" → 不是子序列(缺少x)
3. 你给的案例 s="sjjk" t="sjjjjjssskkkkk" → 正确判断为"不是子序列"(因为t中第三个j之后没有立即出现k)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 6 天前

没bug

某一个“天” 发表于 6 天前

哪有问题

666999666999 发表于 6 天前

某一个“天” 发表于 2025-7-20 17:45
哪有问题


sjjk是sjjjjjssskkkkk的子序列吗??相对位置不是改变了吗

某一个“天” 发表于 6 天前

题目上有说明
页: [1]
查看完整版本: 关于python课后作业33讲动动手答案的疑问