Skip to main content
A cup of beer
  1. ACM Hub/

🎉|LeetOffer48|最长不含重复字符的子字符串

·87 words·1 min
Table of Contents

难度:Mid

题目 #

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

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

思路 #

  • 状态定义:dp[i]即以s[i]为结尾的满足题意的最长子串长度。
  • 利用另一个指针j线性地向下标缩小的方向探查第一个和s[i]相同字母的位置,其和s[i]之间的距离就是j。
  • 判断j和dp[i-1] + 1的大小关系。若前者小于后者,说明重复字符在以i-1结尾的符合要求的子串的内部,否则在其外部。对于前一种情况,取j即可,对于后一种情况,取dp[i-1]+1即可。即取二者的交。

代码实现 #

#include <bits/stdc++.h>
using namespace std;

class Solution {
    int dp[40010];

public:
    int lengthOfLongestSubstring(string s) {
        memset(dp,0,sizeof(dp));
        int n = s.length();
        if(n == 0)
            return 0;
        dp[0] = 1;
        int res = 1;
        for(int i=1;i<n;i++){
            int j=1;
            for(;i-j >= 0;j++){
                if(s[i-j]==s[i])break;
            }
            dp[i] = j > dp[i - 1] + 1? dp[i - 1] + 1 : j;
            res = max(res,dp[i]);
        }
        return res;
    }
};