列表

详情


NC170. 最长不含重复字符的子字符串

描述

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

示例1

输入:

"abcabcbb"

输出:

3

说明:

因为无重复字符的最长子串是"abc",所以其长度为 3。

示例2

输入:

"bbbbb"

输出:

1

说明:

因为无重复字符的最长子串是"b",所以其长度为 1。

示例3

输入:

"pwwkew"

输出:

3

说明:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 528KB, 提交时间: 2021-11-28

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * f(i)以i结尾的最长不含重复子字符串长度
     * 
     * @param s string字符串 
     * @return int整型
     */
    int lengthOfLongestSubstring(string s) {
        if(s.size()<2)return s.size();
        int curLength = 0;
        int maxLength = 0;
        vector<int> position(1000, -1);
        for(int i=0;i<s.size();i++){
            int preIdx = position[s[i]];
            if(preIdx<0||i-preIdx>curLength)curLength++;
            else{
                if(curLength>maxLength)maxLength = curLength;
                curLength = i-preIdx;
            }
            position[s[i]] = i;
        }
        if(curLength>maxLength)maxLength=curLength;
        return maxLength;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 564KB, 提交时间: 2022-02-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int lengthOfLongestSubstring(string s) {
        // write code here
        vector<int> dp(256,-1);
        int maxlen=0;
        int begin = -1;
        for(int i =0;i<s.size();i++){
            if(dp[s[i]]>begin)
                begin = dp[s[i]];
            dp[s[i]] = i;
            maxlen = max(maxlen,i-begin);
        }
        return maxlen;
    }
};

Go 解法, 执行用时: 3ms, 内存消耗: 1192KB, 提交时间: 2021-11-29

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return int整型
*/
func lengthOfLongestSubstring( s string ) int {
    if len(s)<2 {
        return len(s)
    }
    left,right,res :=0,0,1
    m :=make([]int,256)
    for right <len(s){
        m[s[right]]++
        for m[s[right]]!=1{
            m[s[left]]--
            left++
        }
        if right-left+1>res{
            res =right-left+1
        }
        right ++
    }
    return res
}

C++ 解法, 执行用时: 4ms, 内存消耗: 524KB, 提交时间: 2021-11-24

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int lengthOfLongestSubstring(string s) {
        int ret = 1;
        int bi = 0;
        for(int i = 1; i < s.size(); i++){
            for(int j = i - 1; j >= bi; j--){
                if(s.at(i) == s.at(j)){
                    if(i - bi > ret){
                        ret = i - bi;
                    }
                    bi = j + 1;
                    break;
                }
            }
        }
        if(s.size() - bi > ret){
            ret = s.size() - bi;
        }
        return ret;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 528KB, 提交时间: 2022-01-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int lengthOfLongestSubstring(string s) {
        // write code here
        vector<int> dp(256, -1);
        int ret = 0, start = -1;
        for(int i = 0; i < s.length(); i++) {
            if(dp[s[i]] > start)
                start = dp[s[i]];
            dp[s[i]] = i;
            ret = max(ret, i - start);
        }
        return ret;
    }
};

上一题