LeetCode:3. Longest Substring Without Repeating Characters(找出最长子串没有重复字符)

柔光的暖阳◎ 2022-04-11 02:40 278阅读 0赞

文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。

这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)

文章目录:

java实现方法1:

python实现方法1:

java实现方法2:

python实现方法2:

源码地址:


题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

  1. 输入: "pwwkew"
  2. 输出: 3
  3. 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

来源:力扣(LeetCode)


java实现方法1:

  1. /**
  2. * 最长无重复字符串
  3. *
  4. * @param s 字符串
  5. * @return 长度
  6. */
  7. public int lengthOfLongestSubstring(String s) {
  8. if (s == null || s.length() < 1) {
  9. return 0;
  10. }
  11. int length = s.length();
  12. int maxLength = 0;
  13. for (int i = 0; i < length; i++) {
  14. for (int j = i + 1; j < length + 1; j++) {
  15. String sub = s.substring(i, j);
  16. boolean flag = judgeNoRepeat(sub);
  17. if (flag) {
  18. maxLength = Math.max(maxLength, sub.length());
  19. }
  20. }
  21. }
  22. return maxLength;
  23. }
  24. /**
  25. * 判断字符串有没有重复字符串
  26. *
  27. * @param sub 子字符串
  28. * @return 布尔值
  29. */
  30. private boolean judgeNoRepeat(String sub) {
  31. Set<Character> set = new HashSet<>();
  32. for (char ch : sub.toCharArray()) {
  33. set.add(ch);
  34. }
  35. return set.size() == sub.length();
  36. }

时间复杂度:O(n^2)

空间复杂度:O(n)


python实现方法1:

  1. def length_of_longest_substring(self, s: str) -> bool:
  2. '''
  3. 最大无重复字符串
  4. Args:
  5. s: 字符串
  6. Returns:
  7. 长度
  8. '''
  9. max_length = 0
  10. for i in range(len(s)):
  11. for j in range(i + 1, len(s) + 1):
  12. sub = s[i:j]
  13. if len(set(sub)) == len(sub):
  14. max_length = max(max_length, len(sub))
  15. return max_length

时间复杂度:O(n^2)

空间复杂度:O(n)


java实现方法2:

  1. /**
  2. * 最长子字符串
  3. *
  4. * @param s 字符串
  5. * @return 长度S
  6. */
  7. public int lengthOfLongestSubstring2(String s) {
  8. if (s.length() == 0) {
  9. return 0;
  10. }
  11. HashMap<Character, Integer> map = new HashMap<>();
  12. int left = 0;
  13. int length = 0;
  14. for (int i = 0; i < s.length(); i++) {
  15. if (map.containsKey(s.charAt(i))) {
  16. left = Math.max(left, map.get(s.charAt(i)) + 1);
  17. }
  18. map.put(s.charAt(i), i);
  19. length = Math.max(length, i - left + 1);
  20. }
  21. return length;
  22. }

时间复杂度:O(n)

空间复杂度:O(n)


python实现方法2:

  1. def length_of_longest_substring(self, s: str) -> bool:
  2. '''
  3. 最大无重复字符串
  4. Args:
  5. s: 字符串
  6. Returns:
  7. 长度
  8. '''
  9. dict_map = {}
  10. left, max_length = 0, 0
  11. for i in range(len(s)):
  12. if s[i] in dict_map:
  13. left = max(left, dict_map.get(s[i]) + 1)
  14. dict_map[s[i]] = i
  15. max_length = max(max_length, i - left + 1)
  16. return max_length

时间复杂度:O(n)

空间复杂度:O(n)


源码地址:

https://github.com/zhangyu345293721/leetcode

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读