鱼C论坛

 找回密码
 立即注册
查看: 3109|回复: 6

几个问题 求解答!

[复制链接]
发表于 2015-4-13 22:38:27 | 显示全部楼层 |阅读模式

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

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

x
第一题:COUNTING BOBS数bob
(15/15 points)
Assume s is a string of lower casecharacters.
Write a program that prints the number of times thestring 'bob' occurs in s. For example, ifs = 'azcbobobegghakl', then your program should print从s字符串中输出bob的出现次数,输出结果如下:
Number oftimes bob occurs is: 2




第二题:ALPHABETICAL SUBSTRINGS按字母顺序排列的子字符串
(15/15 points)
Assume s is a string of lower casecharacters.
Write a program that prints the longest substringof s in which the letters occur in alphabetical order. For example,if s = 'azcbobobegghakl', then your program should print输出s字符串中最长的子字符串(该字符串按字母排序)
Longestsubstring in alphabetical order is: beggh


希望各路高手帮帮忙!最好附上解答思路!



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

使用道具 举报

发表于 2015-4-14 00:35:04 | 显示全部楼层
第一题:
  1. >>> s = 'azcbobobegghakl'
  2. >>> c = 0
  3. >>> for n in range(len(s) - 2):
  4.         if s[n:n+(len('bob'))] == 'bob':
  5.                 c += 1

  6.                
  7. >>> c
  8. 2
复制代码

应该好理解,每三个字符的遍历,相等计数就加一。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 01:15:36 | 显示全部楼层
第二题:
  1. s = 'azcbobobegghakl'
  2. c = 0

  3. for i in range(len(s)): #子字符串的开始位置
  4.     for j in range(i,len(s)): #子字符串的结束位置
  5.         temp = s[i:(j + 1)] #切片子字符串
  6.         #print(temp)
  7.         if (temp == ''.join(sorted(temp))): #是否是按字母排序
  8.             if len(temp) > c: #是否比以前的子字符串长
  9.                 c = len(temp)
  10.                 maxstr = temp

  11. print('Longestsubstring in alphabetical order is:%s'%(maxstr))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-4-14 07:45:32 | 显示全部楼层

动态规划!?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 10:46:05 | 显示全部楼层
本帖最后由 wei_Y 于 2015-4-14 10:47 编辑

第一题:
  1. def bob(strs):
  2.     result = [strs[i:i+3] for i in range(len(strs)-2)]
  3.     return result.count('bob')
复制代码

思路:
每三个截取一个字符串添加到列表,计算'bob'在列表中的总个数。

第二题:
  1. def longsub(strs):
  2.     result = []
  3.     for i in range(len(strs)):
  4.         temp = [strs[i]]
  5.         for j in range(i, len(strs)-1):
  6.             if strs[j] <= strs[j+1]:
  7.                 temp += [strs[j+1]]
  8.             else:
  9.                 result.append(temp)
  10.                 break
  11.     return ''.join(max(result, key=len))
复制代码

思路:
逐个比较大小(即是否按顺序排列),是则在临时列表里添加此值,不是则在结果列表里添加临时列表。
最后输出最大长度的一个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 20:16:54 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-14 20:21 编辑

第一题版主的版本好简洁~~
第二题版主的解答更省空间,我的应该更省时间,但有个缺陷,如果有同样长的最长字符串,输出的是开始的字母排在最前的那个串,
  1. s_1 =[]
  2. n = len(s)
  3. for i in range(n):
  4.     j = 0  # j存储从这个字符开始的符合条件的串长度
  5.     while (i+j+1) <= (n-1) and s[i+j] <= s[i+j+1]:
  6.         j += 1  # 如果当前长度后面还有字母,且它也符合要求则串长加1
  7.     s_1.append(s[i:i+j+1])  # 将找到的符合条件的串加入结果集中
  8. print(max(s_1, key=len))  # 打印最长的串
复制代码

评分

参与人数 1鱼币 +10 收起 理由
~风介~ + 10 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2015-4-16 17:41:27 | 显示全部楼层
好乱
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-15 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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