题目内容
Given a string, find the length of the longest substring without repeating characters.
Example:
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 "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
分析过程
- 题目归类:
array,遍历,dp - 题目分析:
找到连续字串,输出最长的没有重复字母的连续字串。
采用循环法一定可以做出来,但是时间复杂度太差,最差是O(n^2),因为每次子串增长1都需要遍历一次看看有没有重复的数据,可以用一个hashmap来记录子串的数据。其中key为 char,value 为 index。那么每次做的就是- 定义 i,j 分别为字串的起始和终点,创建一个HashMap 保存所有在ij 中的数据。
2.查询index = map.get(String.charAt(j))是否在ij之间,如果在,*(当i==j时不更新)将hashmap 更新,并把i = index+1;计算一个sum的值。
- 定义 i,j 分别为字串的起始和终点,创建一个HashMap 保存所有在ij 中的数据。
- 边界分析:
- 空值分析、
如果string 为 null 则返回null - 循环边界分析
j的值不大于string.size();
- 空值分析、
- 方法分析:
- 数据结构分析
hashmap保存数据可以降低循环的次数。 - 状态机
- 状态转移方程
- 最优解
- 数据结构分析
测试用例构建
[],
[a,a,a,a]
[a]
[abca]代码实现
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { if(s == null || s.length()==0) return 0; int sum = 1; HashMap<Character,Integer> map = new HashMap<>(); int i = 0; for(int j = 0 ; j < s.length();j++){ char ch = s.charAt(j); if(map.containsKey(ch)){ int index = map.get(ch); if(sum < j-i) sum = j-i; for(;i<=index;i++) map.remove(s.charAt(i)); i = index+1; } map.put(ch,j); } if(sum >= s.length()-i) return sum; else return s.length()-i; } }
题目内容
Given a string, find the length of the longest substring without repeating characters.
Example:
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 "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
分析过程
- 题目归类:
array,遍历,dp - 题目分析:
找到连续字串,输出最长的没有重复字母的连续字串。
采用循环法一定可以做出来,但是时间复杂度太差,最差是O(n^2),因为每次子串增长1都需要遍历一次看看有没有重复的数据,可以用一个hashmap来记录子串的数据。其中key为 char,value 为 index。那么每次做的就是- 定义 i,j 分别为字串的起始和终点,创建一个HashMap 保存所有在ij 中的数据。
2.查询index = map.get(String.charAt(j))是否在ij之间,如果在,*(当i==j时不更新)将hashmap 更新,并把i = index+1;计算一个sum的值。
- 定义 i,j 分别为字串的起始和终点,创建一个HashMap 保存所有在ij 中的数据。
- 边界分析:
- 空值分析、
如果string 为 null 则返回null - 循环边界分析
j的值不大于string.size();
- 空值分析、
- 方法分析:
- 数据结构分析
hashmap保存数据可以降低循环的次数。 - 状态机
- 状态转移方程
- 最优解
- 数据结构分析
测试用例构建
[],
[a,a,a,a]
[a]
[abca]代码实现
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { if(s == null || s.length()==0) return 0; int sum = 1; HashMap<Character,Integer> map = new HashMap<>(); int i = 0; for(int j = 0 ; j < s.length();j++){ char ch = s.charAt(j); if(map.containsKey(ch)){ int index = map.get(ch); if(sum < j-i) sum = j-i; for(;i<=index;i++) map.remove(s.charAt(i)); i = index+1; } map.put(ch,j); } if(sum >= s.length()-i) return sum; else return s.length()-i; } }
效率提高
一种更好的方法就是不用每次都清理hashmap,可以保持hashmap只不过判断时候 i = Math.max(i,map.get(s.charAt(j))+1);
拓展问题
Longest Substring with At Most Two Distinct Characters
Medium
Longest Substring with At Most K Distinct Characters
Hard
Subarrays with K Different Integers
Hard
来源:https://www.cnblogs.com/clnsx/p/12272610.html