[LeetCode] 3. Longest Substring Without Repeating Characters 最长不重复子串
[LeetCode] 3. Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is 'abc'
, with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is 'b'
, with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is 'kew'
, with the length of 3.
基本思路:使用去重方法set,判断是否有 字符串长度 == 去重长度 ,通过那么就是不重复子串,统计最长的一个
判断顺序:字符串 = 'abcd'
abcd
abc
ab
bcd
bc
cd
优化方法:1.每次查找长度是递减的,如果现在的 max_length > 下面要判断的子串长度,break
2.找到一次,当前串不用再往下判断了,往下长度一定比当前小。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s) == 0 : return 0 #空串判断
max_length = 1 #初始值设置为1,最后没找到不同的子串就输出1
j=0
for x in range(len(s)-1):
i = len(s)
if (i-j) <= max_length: #如果往下的最长子串已经小于max_length 退出
break
flag = 0
while(i-j>max_length and flag==0):
temp_str = s[j:i]
temp_set = set(temp_str)
if len(temp_str) == len(temp_set) and len(temp_set)>max_length:
max_length = len(temp_str)
flag =1 #找到一个,退出子循环,不用再往下了,再往下一定长度短
i-=1
j+=1
return max_length
心得:这题我只会用python做,上来是毫无头绪,思考了很久终于实现了自己的方法,只有最后一个用例超时没通过。看了一下最后一个字符串太长了。我也没办法了,
已经尽力,只能看别人的方法了。不过我觉得我做的也很不错了。
大佬代码,速度击败99.6% ,并且就这几行。。。
思路:循环加入元素,有相同的就把前面的截去,最后得到最长的串
EG:
abcabcd
->abc ->bca ->cab ->abcd-> 输出4 这个算法的确可以保证遍历所有两个相同元素之间的子串 ,这种方法在最大子列和中也有应用 ,是为动态规划
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: d = "" f = "" for i in range(len(s)): if s[i] not in f: f += s[i] else: if len(d) < len(f): d = f f = f[f.index(s[i])+1::] + s[i] return max(len(d), len(f))
Java Solution
public static void func(String string) { String workString = ""; String maxString = ""; int maxLength = 0; for (int i = 0; i < string.length(); ++i) { char next = string.charAt(i); if (workString.contains(next + "")) { workString.substring(workString.indexOf(next) + 1); } else { workString += next; if (maxLength < workString.length()) { maxLength = workString.length(); maxString = workString; } } } System.out.println("最大不重复字串为" + maxString); System.out.println("长度= " + maxLength); }