|

楼主 |
发表于 2017-11-24 09:01:22
|
显示全部楼层
本帖最后由 jerryxjr1220 于 2017-11-27 15:41 编辑
贴一下我的解题思路及参考解答。
常规解答:循环
自然是运用循环,遍历所有字符串,先取得局部不重复字符串,再比较全局不重复字符串,如果局部解>全局解,则替换。
这个思路也是很多参赛鱼油运用的,只是大多数鱼油都用了双层循环,其实是不需要的,单层循环就可以解决了,这样效率可以快一个数量级。
- def longest_substring_1(string):
- longest = ''
- sub = string[0]
- for i in range(1,len(string)):
- if string[i] in sub:
- longest = sub if len(sub)>len(longest) else longest
- sub=string[i]
- else:
- sub+=string[i]
- longest = sub if len(sub)>len(longest) else longest
- return len(longest)
复制代码
感谢@shuo指出错误,应该用列表储存sub字符串,纠正一下:
- def longest_substring_1(string):
- longest = ''
- sub = [string[0]]
- for i in range(1,len(string)):
- for j in range(len(sub)):
- if string[i] in sub[j]:
- longest = sub[j] if len(sub[j])>len(longest) else longest
- sub[j]=string[i]
- else:
- sub[j]+=string[i]
- sub.append(string[i])
- sub=list(set(sub))
- for j in range(len(sub)):
- longest = sub[j] if len(sub[j])>len(longest) else longest
- return longest
复制代码
第二种思路:递归
递归的好处是代码可以比较简洁,但是效率方面来说,肯定是不如循环来得高效,但是对于我们这种小题目来说,递归也是不错的解决方案。不过递归对于不是新人来说,还是不容易掌握,希望多通过练习加强对递归程序的理解。
- def longest_substring_2(string,sub='',longest = ''):
- if not string: return len(longest) if len(longest)>len(sub) else len(sub)
- if string[0] in sub: return longest_substring_2(string[1:],string[0],longest if len(longest)>=len(sub) else sub)
- return longest_substring_2(string[1:],sub+string[0],longest)
复制代码
递归法只有短短的四行,第一行是定义函数,第二行定义递归结束的条件,第三行是定义子串中有重复字符时的处理,第四行是定义一般情况下无重复字符子串的处理。是不是很简单?
再来看一个极限压缩的写法,同样是递归,但是运用python的语法糖把递归嵌套来写,一行代码输出。
- def longest_substring_3(string,sub='',longest = ''): return (len(longest) if len(longest)>len(sub) else len(sub)) if not string else ((longest_substring_3(string[1:],string[0],longest if len(longest)>=len(sub) else sub)) if string[0] in sub else longest_substring_3(string[1:],sub+string[0],longest))
复制代码
上两种方法同样也和循环一样,应该用列表储存子字符串,所以也要相应调整,我偷懒了,后续留给有兴趣的鱼油来改吧。
解题愉快! |
|