鱼C论坛

 找回密码
 立即注册
查看: 244|回复: 3

[已解决]29讲动手1和动手2 没有理解代码

[复制链接]
发表于 2025-3-8 14:11:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # 动手0 重叠的判断不了
  2. text = input("What text:")
  3. words = input("What words:")
  4. words = words.split()
  5. ans = []
  6. w0 = words[0]
  7. len1 = len(text)
  8. len2 = 0
  9. i_copy = 0
  10. for each in words:
  11.     len2 = len(each)
  12.     w0 = each[0]
  13.     for i in range (0,len1):
  14.         len0 = 1
  15.         if text[i] == w0:
  16.             i_copy = i
  17.             for j in range(1,len2):
  18.                 i = i + 1
  19.                 if each[j] == text[i]:
  20.                     len0 += 1
  21.                     if len0 == len2:
  22.                         ans.append([i_copy,i_copy+len2-1])
  23.                 else:
  24.                     break
  25.         else:
  26.             continue
  27. print(ans)
复制代码

动手0 的代码我直接用循环判断了,确实很复杂,但是没有想到答案用find的方法,一下子忘记这个函数了,想问问如果就是单纯用循环的话,应该怎么做呢?目前这个代码可以判断前两种情况,但是没有办法判断那种重复出现的代码就是第三种情况,请问应该怎么修改呢?

  1. # 动手1 答案
  2. s = input("请输入一个由字母构成的字符串:")

  3.    

  4. n = len(s)

  5. for i in range(1, n//2+1):

  6.     # 如果子字符串的长度为i,则n必须可以被i整除才行

  7.     if n % i == 0:

  8.         # 如果子字符串的长度为i,则i到i*2之间是一个重复的子字符串

  9.         if s.startswith(s[i:i*2]) and s.count(s[i:i*2]) == n/i:

  10.             print(True)

  11.             break

  12. # for...else的用法,小甲鱼希望大家还没有忘记哦^o^

  13. else:

  14.     print(False)
复制代码


动手1完全不太理解,可以详细解释一下代码吗?
最佳答案
2025-3-8 14:12:09
29讲 动手0: 重叠判断代码说明

下面是一个用于判断文本中是否存在重复单词的简单示例:

  1. text = input("What text: ")
  2. words = input("What words: ")
  3. words = words.split()
  4. ans = []
  5. len1 = len(text)

  6. for each in words:
  7.     index = 0
  8.     while index < len1:
  9.         index = text.find(each, index)
  10.         if index == -1:
  11.             break
  12.         else:
  13.             ans.append((each, index))
  14.             index += len(each)  # 更新索引以继续搜索下一个可能的重复

  15. print(ans)
复制代码


解释:

  • text.find(each, index) 用于在字符串 text 中从位置 index 开始查找子串 each
  • 每找到一个匹配的起始索引后,将其添加到 ans 列表,同时更新 index 以绕过当前匹配继续查找。
  • 这种方法较易处理字符串中单词的重叠和重复问题。


29讲 动手1: 字符串重复子串问题代码解释

下面是代码的详细解释:

  1. s = input("请输入一个由字母构成的字符串:")
  2. n = len(s)

  3. for i in range(1, n//2+1):
  4.     # 如果子字符串的长度为i,则n必须可以被i整除才行
  5.     if n % i == 0:
  6.         sub = s[:i]  # 取得可能的重复子串
  7.         # 如果子字符串的长度为i,则i到i*2之间是一个重复的子字符串
  8.         if s.startswith(sub) and s.count(sub) == n // i:
  9.             print(True)
  10.             break
  11. else:
  12.     print(False)
复制代码


解释:

  • 首先读取输入字符串并计算其长度 n
  • for i in range(1, n//2+1): 内循环从长度为1的子串开始检查,遍历可能的子串长度,直到一半长度位置。
  • 仅当字符串总长度能均分为若干子串时,才有可能存在完整重复子串。if n % i == 0: 检查能否整除。
  • sub = s[:i] 取出一个可能的子串。
  • s.startswith(sub) and s.count(sub) == n // i 检查子串是否为字符串开头部分,且该子串出现次数应能覆盖整个字符串。
  • 找到合法的子串马上返回 Truebreak
  • 如果遍历所有可能且没找到,最终执行 elseprint(False)


这种结构效率较高,因为只在可能的周期长度情况下深入验证子串。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-3-8 14:12:09 | 显示全部楼层    本楼为最佳答案   
29讲 动手0: 重叠判断代码说明

下面是一个用于判断文本中是否存在重复单词的简单示例:

  1. text = input("What text: ")
  2. words = input("What words: ")
  3. words = words.split()
  4. ans = []
  5. len1 = len(text)

  6. for each in words:
  7.     index = 0
  8.     while index < len1:
  9.         index = text.find(each, index)
  10.         if index == -1:
  11.             break
  12.         else:
  13.             ans.append((each, index))
  14.             index += len(each)  # 更新索引以继续搜索下一个可能的重复

  15. print(ans)
复制代码


解释:

  • text.find(each, index) 用于在字符串 text 中从位置 index 开始查找子串 each
  • 每找到一个匹配的起始索引后,将其添加到 ans 列表,同时更新 index 以绕过当前匹配继续查找。
  • 这种方法较易处理字符串中单词的重叠和重复问题。


29讲 动手1: 字符串重复子串问题代码解释

下面是代码的详细解释:

  1. s = input("请输入一个由字母构成的字符串:")
  2. n = len(s)

  3. for i in range(1, n//2+1):
  4.     # 如果子字符串的长度为i,则n必须可以被i整除才行
  5.     if n % i == 0:
  6.         sub = s[:i]  # 取得可能的重复子串
  7.         # 如果子字符串的长度为i,则i到i*2之间是一个重复的子字符串
  8.         if s.startswith(sub) and s.count(sub) == n // i:
  9.             print(True)
  10.             break
  11. else:
  12.     print(False)
复制代码


解释:

  • 首先读取输入字符串并计算其长度 n
  • for i in range(1, n//2+1): 内循环从长度为1的子串开始检查,遍历可能的子串长度,直到一半长度位置。
  • 仅当字符串总长度能均分为若干子串时,才有可能存在完整重复子串。if n % i == 0: 检查能否整除。
  • sub = s[:i] 取出一个可能的子串。
  • s.startswith(sub) and s.count(sub) == n // i 检查子串是否为字符串开头部分,且该子串出现次数应能覆盖整个字符串。
  • 找到合法的子串马上返回 Truebreak
  • 如果遍历所有可能且没找到,最终执行 elseprint(False)


这种结构效率较高,因为只在可能的周期长度情况下深入验证子串。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2025-3-8 16:23:49 | 显示全部楼层
本帖最后由 jackz007 于 2025-3-8 18:33 编辑

         使用 find() 的版本
  1. text  = input(" What text : ")
  2. words = input("What words : ")
  3. e = []
  4. for w in words . split(' ') :
  5.     k = text . find(w , 0)
  6.     while k != -1 :
  7.         e . append([k , k + len(w) - 1])
  8.         k = text . find(w , k + 1)
  9. if e:
  10.     e . sort()
  11.     print(e)
复制代码


        不使用 find() 的版本:
  1. text  = input(" What text : ")
  2. words = input("What words : ")
  3. e = []
  4. for w in words . split(' ') :
  5.     for k in range(len(text) - len(w) + 1) :
  6.         if text[k : k + len(w)] == w :
  7.             e . append([k , k + len(w) - 1])
  8. if e:
  9.     e . sort()
  10.     print(e)
复制代码


运行实况;
  1. D:\[00.Exercise]\[Python]>python x.py
  2. What text : I love FishC and FishC love me
  3. What words : FishC
  4. [[7, 11], [17, 21]]

  5. D:\[00.Exercise]\[Python]>python x.py
  6. What text : I love FishC and FishC love me
  7. What words : FishC love
  8. [[2, 5], [7, 11], [17, 21], [23, 26]]

  9. D:\[00.Exercise]\[Python]>python x.py
  10. What text : FCFCF
  11. What words : FCF FC
  12. [[0, 1], [0, 2], [2, 3], [2, 4]]

  13. D:\[00.Exercise]\[Python]>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2025-3-9 21:57:15 | 显示全部楼层
jackz007 发表于 2025-3-8 16:23
使用 find() 的版本

谢谢回复,就是您的代码每次都非常简洁,所以我有一些些没有理解,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表