鱼C论坛

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

[已解决]查找字符串

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

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

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

x
编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为 “You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为 “im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。
     
程序执行效果:

小甲鱼的代码
def findStr(desStr, subStr):
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目标字符串中未找到字符串!')
    else:
        for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
                if desStr[each1+1] == subStr[1]:
                    count += 1
                    
        print('子字符串在目标字符串中共出现 %d 次' % count)

desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)

我的代码:
def findstr():
    print('请输入目标字符串:', end = '')
    str1 = input()
    print('请输入子字符串(两个字符)', end = '')
    str2 = input()
    num = str1.count(str2)
    print('子字符串在目标字符串中共出现', num, '次')

请帮忙看看我这样写有什么问题?
最佳答案
4 天前

  1. def findstr():
  2.     print('请输入目标字符串:', end='')
  3.     str1 = input()
  4.     print('请输入子字符串(两个字符):', end='')
  5.     str2 = input()
  6.    
  7.     # 检查子串长度是否为2
  8.     if len(str2) != 2:
  9.         print('错误:子字符串必须为两个字符')
  10.         return
  11.    
  12.     count = 0
  13.     # 遍历所有可能的起始位置(包括重叠情况)
  14.     for i in range(len(str1)-1):
  15.         if str1[i:i+2] == str2:
  16.             count += 1
  17.    
  18.     if count == 0:
  19.         print('在目标字符串中未找到子字符串!')
  20.     else:
  21.         print('子字符串在目标字符串中共出现', count, '次')
复制代码


你的代码存在两个主要问题:

  • 未处理子字符串重叠的情况str.count() 方法统计的是非重叠出现次数。例如在 "imim" 中找 "im",正确应该统计2次,而用count方法会正确;但在 "iiiim" 中找 "ii",正确应该统计3次(位置0-1、1-2、2-3),用count方法只会统计2次
  • 未校验子字符串长度:题目明确要求子字符串长度为2,但你的代码未做校验,如果用户输入1个或3个字符会导致统计错误


改进说明:
1. 通过循环逐字符检查 str1[i:i+2]
2. 遍历范围是 len(str1)-1 确保最后能取到两个字符
3. 增加子字符串长度校验

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

使用道具 举报

发表于 4 天前 | 显示全部楼层    本楼为最佳答案   

  1. def findstr():
  2.     print('请输入目标字符串:', end='')
  3.     str1 = input()
  4.     print('请输入子字符串(两个字符):', end='')
  5.     str2 = input()
  6.    
  7.     # 检查子串长度是否为2
  8.     if len(str2) != 2:
  9.         print('错误:子字符串必须为两个字符')
  10.         return
  11.    
  12.     count = 0
  13.     # 遍历所有可能的起始位置(包括重叠情况)
  14.     for i in range(len(str1)-1):
  15.         if str1[i:i+2] == str2:
  16.             count += 1
  17.    
  18.     if count == 0:
  19.         print('在目标字符串中未找到子字符串!')
  20.     else:
  21.         print('子字符串在目标字符串中共出现', count, '次')
复制代码


你的代码存在两个主要问题:

  • 未处理子字符串重叠的情况str.count() 方法统计的是非重叠出现次数。例如在 "imim" 中找 "im",正确应该统计2次,而用count方法会正确;但在 "iiiim" 中找 "ii",正确应该统计3次(位置0-1、1-2、2-3),用count方法只会统计2次
  • 未校验子字符串长度:题目明确要求子字符串长度为2,但你的代码未做校验,如果用户输入1个或3个字符会导致统计错误


改进说明:
1. 通过循环逐字符检查 str1[i:i+2]
2. 遍历范围是 len(str1)-1 确保最后能取到两个字符
3. 增加子字符串长度校验

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

使用道具 举报

发表于 4 天前 | 显示全部楼层
除了代码可以再简化一下,没有问题。

简化:将 print() 和它后面的 input() 合并

  1. def findstr():
  2.     str1 = input('请输入目标字符串:')
  3.     str2 = input('请输入子字符串(两个字符)')
  4.     num = str1.count(str2)
  5.     print('子字符串在目标字符串中共出现', num, '次')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
本帖最后由 jackz007 于 2025-5-8 22:44 编辑

        函数具有工具属性,应该适合通用,所以,应该在全缄默的状态下工作,也就是说,函数必须尽量避免键盘输入和屏幕输出。
        参考代码:
  1. def findstr(desStr , subStr) :
  2.     c , i = 0 , 0
  3.     if len(desStr) >= len(subStr) and len(subStr) == 2 :
  4.         while i < len(desStr) - 1 :
  5.             if desStr[i : i + 2] == subStr :
  6.                 c , i = c + 1 , i + 1
  7.             i += 1
  8.     return c

  9. str1 = input('请输入目标字符串:')
  10. str2 = input('请输入子字符串(两个字符):')
  11. print('子字符串在目标字符串中共出现' , findstr(str1 , str2) , '次')
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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