TJ0929 发表于 2025-3-8 14:11:50

29讲动手1和动手2 没有理解代码

# 动手0 重叠的判断不了
text = input("What text:")
words = input("What words:")
words = words.split()
ans = []
w0 = words
len1 = len(text)
len2 = 0
i_copy = 0
for each in words:
    len2 = len(each)
    w0 = each
    for i in range (0,len1):
      len0 = 1
      if text == w0:
            i_copy = i
            for j in range(1,len2):
                i = i + 1
                if each == text:
                  len0 += 1
                  if len0 == len2:
                        ans.append()
                else:
                  break
      else:
            continue
print(ans)
动手0 的代码我直接用循环判断了,确实很复杂,但是没有想到答案用find的方法,一下子忘记这个函数了,想问问如果就是单纯用循环的话,应该怎么做呢?目前这个代码可以判断前两种情况,但是没有办法判断那种重复出现的代码就是第三种情况,请问应该怎么修改呢?

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

   

n = len(s)

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

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

    if n % i == 0:

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

      if s.startswith(s) and s.count(s) == n/i:

            print(True)

            break

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

else:

    print(False)

动手1完全不太理解,可以详细解释一下代码吗?

FishC 发表于 2025-3-8 14:12:09

29讲 动手0: 重叠判断代码说明

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

text = input("What text: ")
words = input("What words: ")
words = words.split()
ans = []
len1 = len(text)

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

print(ans)

解释:


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


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

下面是代码的详细解释:

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

for i in range(1, n//2+1):
    # 如果子字符串的长度为i,则n必须可以被i整除才行
    if n % i == 0:
      sub = s[:i]# 取得可能的重复子串
      # 如果子字符串的长度为i,则i到i*2之间是一个重复的子字符串
      if s.startswith(sub) and s.count(sub) == n // i:
            print(True)
            break
else:
    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 检查子串是否为字符串开头部分,且该子串出现次数应能覆盖整个字符串。
[*] 找到合法的子串马上返回 True 并 break。
[*] 如果遍历所有可能且没找到,最终执行 else 的 print(False)。


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

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

jackz007 发表于 2025-3-8 16:23:49

本帖最后由 jackz007 于 2025-3-8 18:33 编辑

         使用 find() 的版本
text= input(" What text : ")
words = input("What words : ")
e = []
for w in words . split(' ') :
    k = text . find(w , 0)
    while k != -1 :
      e . append()
      k = text . find(w , k + 1)
if e:
    e . sort()
    print(e)

      不使用 find() 的版本:
text= input(" What text : ")
words = input("What words : ")
e = []
for w in words . split(' ') :
    for k in range(len(text) - len(w) + 1) :
      if text == w :
            e . append()
if e:
    e . sort()
    print(e)

运行实况;
D:\\>python x.py
What text : I love FishC and FishC love me
What words : FishC
[, ]

D:\\>python x.py
What text : I love FishC and FishC love me
What words : FishC love
[, , , ]

D:\\>python x.py
What text : FCFCF
What words : FCF FC
[, , , ]

D:\\>

TJ0929 发表于 2025-3-9 21:57:15

jackz007 发表于 2025-3-8 16:23
使用 find() 的版本




谢谢回复,就是您的代码每次都非常简洁,所以我有一些些没有理解,谢谢
页: [1]
查看完整版本: 29讲动手1和动手2 没有理解代码