3. 无重复字符的最长子串

题目描述:

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

示例 1:

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

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

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


解法:

1.滑动窗口
新建一个HashMap保存字符与其在字符串中对应的位置
设置指针left,i初始化都为0,i每次++
如果HashMap已经存在当前遍历到的字符,就将left置为上一个left与在HashMap查找到的该字符的位置+1中的较大值

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //滑动窗口
        if(s.length()==0) return 0;
        HashMap hp = new HashMap<>();
        //初始化结果值为0
        int max = 0;
        //初始化左起点为0
        int left = 0;
        for(int i=0;i

2.动态规划
转移方程:
设置dp[i]为字符串位置i时的最长子串的个数
若当前字符是第一次出现 则 dp[i] = dp[i-1]+1
若当前字符串不是第一次出现
1)i-preIndex(这个字符上次出现的位置)>dp[i-1],说明这个字符不在dp[i-1]中,则dp[i] = dp[i-1]+1
2)否则若i-preIndex<=dp[i-],说明这个字符在dp[i-1]中,则dp[i] = i-preindex

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0) return 0;
        if(s.length()<2) return 1;
        HashMap hp = new HashMap();
        int max = 0;
        int[] dp = new int[s.length()];
        dp[0] = 1;
        hp.put(s.charAt(0),0);
        for(int i=1;i

你可能感兴趣的:(3. 无重复字符的最长子串)