鱼C论坛

 找回密码
 立即注册
查看: 2296|回复: 19

[技术交流] Python:每日一题 226(答题有奖)

 关闭 [复制链接]
发表于 2019-8-21 18:28:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2019-8-25 09:12 编辑

今天的题目:

给定一个字符串,请你找出其中不含有重复字符的最长子字符串的长度。

这道题已结束,进入奖励阶段

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子字符串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子字符串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子字符串是 "wke",所以其长度为 3。



我的解法:

  1. def length(string1):
  2.     list1 = []
  3.     for i in range(len(string1)):
  4.         for j in range(len(string1) + 1):
  5.             if i < j:
  6.                 if len(set(string1[i:j])) == len(string1[i:j]):
  7.                     list1.append(j - i)
  8.     return max(list1, default=0)
复制代码


大佬解法:

  1. class Solution(object):
  2.     def lengthOfLongestSubstring(self, s):
  3.         """
  4.         :type s: str
  5.         :rtype: int
  6.         """
  7.         record = dict()#记录每个字母最后一次出现的下标,key是字母,val是下标
  8.         res, start = 0, 0
  9.         for end in range(len(s)):
  10.             if s[end] in record:#出现过
  11.                 start = max(start, record[s[end]] + 1)
  12.             record[s[end]] = end #刷新最新下标
  13.             res = max(res, end - start + 1)  #刷新res
  14.         return res
复制代码


评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
1404461012 + 3 + 3 + 3 解法一个机智,一个奇特

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-22 14:32:17 | 显示全部楼层
  1. list = ['12332156','asdhsrhsfsdfsf','5678u9iofghbj']
  2. for each in list:
  3.     length = len(set(each))
  4.     print('%s不含重复字符的长度为:%d'% (str(each),length))
  5.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-22 14:35:06 | 显示全部楼层

貌似没看清楚题目呀

搜狗截图20190822143443.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-22 15:35:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 16:32:05 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2019-8-22 21:50 编辑

来啦
写的有点烂……
  1. def function(s):
  2.         mx=0;ls=len(s)
  3.         for i in range(len(s)):
  4.                 k=0
  5.                 for j in range(i,len(s)):
  6.                         if s[j] in s[i:j]:break
  7.                         else:k+=1
  8.                 if k>mx:mx=k
  9.         return mx
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 16:36:58 | 显示全部楼层
leetocode的题拿来真的没问题吗,一顿指针移动就得了- -

评分

参与人数 1荣誉 +1 收起 理由
永恒的蓝色梦想 + 1 竟然是LEETCODE的题……

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 16:56:06 | 显示全部楼层
我猜是第一个

评分

参与人数 1荣誉 -1 鱼币 -1 收起 理由
蒋博文 -1 -1 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 17:48:35 | 显示全部楼层
答题就给奖励吗?
  1. str1 = input("请输入字符串:")
  2. n = len(str1)
  3. list1 = []
  4. for i in range(0,n+1):                    #生成所有不重复子字符串列表
  5.     for j in range(i+1,n+1):
  6.         if len(set(str1[i:j])) == len(str1[i:j]):
  7.             list1.append(str1[i:j])
  8. result = list1[0]
  9. for each in list1:                        #筛选出首个最长字符串
  10.     if len(each) > len(result):
  11.         result = each
  12. print(result)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 17:49:43 | 显示全部楼层
  1. def fun(string):
  2.     result_list = []
  3.     temp_string = ""
  4.     i = 0
  5.     while i <= len(string):
  6.         for j in range(i,len(string)):
  7.             if string[j] not in temp_string:
  8.                 temp_string += string[j]
  9.             try:
  10.                 if string[j+1] in temp_string:
  11.                     if temp_string not in result_list:
  12.                         result_list.append(temp_string)
  13.                     temp_string = ""
  14.                     break
  15.             except:
  16.                 if temp_string not in result_list:
  17.                         result_list.append(temp_string)
  18.                 temp_string = ""
  19.                 break
  20.         i += 1
  21.     str_len_list = [len(i) for i in result_list]
  22.     m = str_len_list.index(max(str_len_list))
  23.     result_list[m]
  24.     return result_list[m]
  25.    
  26.    
  27. print(fun("12312312314526757123123"))

  28. print(fun("bbbbb"))

  29. print(fun("pwwkew"))
复制代码


评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-22 20:42:37 | 显示全部楼层
输入: "pipi"
输出: 2
解释: 因为无重复字符的最长子字符串是 "pi",所以其长度为 2。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 09:37:58 | 显示全部楼层
  1. #返回从i位置开始的首个最长不重复字串
  2. def get_sub(ss, i):
  3.     temp = ''
  4.     for i in ss[i:]:
  5.         if i not in temp:
  6.             temp += i
  7.         else:
  8.             break
  9.     return temp


  10. #源串
  11. ss = input("请输入一个字符串:")

  12. #存放找到的最长字串
  13. result = dict({'maxsub' : ''})

  14. str_len = len(ss)
  15. i = 0
  16. while i < str_len:
  17.     sub = get_sub(ss, i)
  18.     if len(sub) > len(result['maxsub']):
  19.         result['maxsub'] = sub
  20.     i += 1

  21. print('最长字串为:%s, 长度:%d' %(result['maxsub'], len(result['maxsub'])))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 09:55:38 | 显示全部楼层
  1. def fun255():

  2.     strs=input('请输入指定的字符串:')
  3.     result=[] #用于储存计算结果
  4.     count=1  #用于计算字符重复的次数
  5.     flag=0   #用于标记位置
  6.     for i in range(1,len(strs)):
  7.         if strs[i] not in strs[flag:i]:
  8.             count+=1
  9.             if i==len(strs)-1:  #遍历到字符串的最后一位时,返回结果并结束循环
  10.                 result.append(count)
  11.         else:
  12.             result.append(count)
  13.             count=1
  14.             flag=i
  15.             if flag==len(strs)-1:  #遍历到字符串的最后一位时,返回结果并结束循环
  16.                 result.append(count)

  17.     return (max(result))

  18. print(fun255())
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 10:05:53 | 显示全部楼层
本帖最后由 lovemaomao 于 2019-8-23 10:12 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-23 11:50:16 | 显示全部楼层
  1. def fun226(s):
  2.     d = {}
  3.     smax = 0
  4.     start = -1
  5.     for k, v in enumerate(s):
  6.         if v in d and d[v] > start:
  7.             start = k - 1
  8.             d[v] = k
  9.         else:
  10.             d[v] = k
  11.             if k - start > smax:
  12.                 smax = k - start
  13.    
  14.     return smax

  15. if __name__ == "__main__":
  16.     s1 = "abcabcbb"
  17.     s2 = "bbbbbb"
  18.     s3 = "pwwkew"
  19.     s4 = "abcabcdabccefgab"

  20.     print(fun226(s1))
  21.     print(fun226(s2))
  22.     print(fun226(s3))
  23.     print(fun226(s4))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 11:54:45 | 显示全部楼层
  1. s = "pwwkew"
  2. L = [-1 for x in range(26)]
  3. left, right, maxlen = 0, 0, 0
  4. while right < len(s):
  5.     index = ord(s[right]) - ord('a')
  6.     if L[index] == -1:
  7.         L[index] = right
  8.         right += 1
  9.         if (right - left) > maxlen:
  10.             maxlen += 1
  11.     else:
  12.         left = L[index]+1
  13.         L[index] = right
  14.         right += 1
  15. print(maxlen)
复制代码

没有大量数据不知道对不对, 时间复杂度 O(n)

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 12:52:20 | 显示全部楼层
  1. def func(s):
  2.     max = 0
  3.     for i in range(len(s)):
  4.         s1 = ""
  5.         for y in s[i:]:
  6.             if y not in s1:
  7.                 s1 += y
  8.             else:
  9.                 break
  10.         if max < len(s1):
  11.             max = len(s1)
  12.     return max
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 13:39:20 | 显示全部楼层
  1. str1 = input('请输入字符串:')
  2. length = len(str1)
  3. list1 = []
  4. list2 = []
  5. for i in range(1,length + 1):             #一一尝试求i最大值
  6.     for each in range(length):            #一一尝试引索
  7.         for eachword in str1[each:each + i]:
  8.             if each + i <= length:
  9.                 if str1[each:each + i].count(eachword) == 1:
  10.                     list2.append(1)
  11.                 else:
  12.                     list2.append(0)
  13.         if (not 0 in list2) and list2 != []:
  14.             list1.append(i)
  15.         list2 = []
  16. print(max(list1))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 05:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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