LeetCode题解 || Longest Substring Without Repeating Characters (O(n)算法)问题

problem:

Given a string, find the length of the longest substring without repeating characters.
For example, the longest substring without repeating letters for "abcabcbb" is "abc",
which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

thinking:

(1)寻找子串,要做一次遍历。

(2)暴力破解法,检查每个子串,利用hash table的映射思想。开一个数组,下标为字符的ASCII码,因为没有说明字符串的类型,能够採取一些措施压缩hash table的大小。暴力破解法的最坏时间复杂度为O(n*n)

(3)发现一个O(n)的算法。非常赞

事实上,这里非常多工作都是反复的、没用的。

看一个样例:

S="abbdeca"。

t1="abbdeca",t1[1]==t1[2]。

t2="bbdeca"。t2[0]==t2[1]。

t3="bdeca",一直扫描到最后。

t4="deca"、t5、t6、t7都同上。

我们在处理t1的时候已经扫描到了s[2],然后处理t3的时候扫描了s[2]到s[6],这两个子串已经扫描完了整个母串。

换言之,能使得子串停止扫描的位置仅仅有两处:1.s[2]。2.s[6](结尾)。

对于还有一个样例S="aaab",能使子串停止扫描的位置各自是:s[1],s[2],s[3](结尾)。

所以我们能够考虑仅仅扫描母串,直接从母串中取出最长的无反复子串。

对于s[i]:

1.s[i]没有在当前子串中出现过。那么子串的长度加1;

2.s[i]在当前子串中出现过,出现位置的下标为j。那么新子串的起始位置必须大于j,为了使新子串尽可能的长,所以起始位置选为j+1。

code:

说明:凝视的解法复杂度为O(n*n),没凝视的位O(n)

#include <iostream>
#include <string>
#include <memory.h>

using namespace std;
/*
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int a[100]; //压缩hash table
        memset(a,0,sizeof(int)*100);
        int length = s.size();
        int index=0;
        int max=0;
        for(int i=0;i<length;i++)
        {
            int j=i;
            while((j<length)&&(a[s.at(j)-32]==0))//压缩hash table
            {
                a[s.at(j)-32]=1;
                index++;
                j++;
            }
            memset(a,0,sizeof(int)*100);
            max=(max>index)?max:index;
            index=0;
            if(j==length-1) //这里也有一个小技巧。能够有效减少时间复杂度
                break;
        }
        return max;
    }
};
*/
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int locs[256];//保存字符上一次出现的位置
        memset(locs, -1, sizeof(locs));

        int idx = -1, max = 0;//idx为当前子串的開始位置-1
        for (int i = 0; i < s.size(); i++)
        {
            if (locs[s[i]] > idx)//假设当前字符出现过,那么当前子串的起始位置为这个字符上一次出现的位置+1
            {
                idx = locs[s[i]];
            }

            if (i - idx > max)//这里是关键!

!!!!!

!

!!
            {
                max = i - idx;
            }

            locs[s[i]] = i;
        }
        return max;
    }
};
int main()
{
    string str = "abcdab";
    Solution mysolution;
    cout<<mysolution.lengthOfLongestSubstring(str)<<endl;

}
时间: 2024-08-04 20:37:51

LeetCode题解 || Longest Substring Without Repeating Characters (O(n)算法)问题的相关文章

【leetcode】 Longest Substring Without Repeating Characters

题目: 给定一个字符串,返回该串没有重复字符的最长子串. 分析: 1)子串:子串要求是连续的. 2)无重复,出现重复就断了,必须从新的位置开始.而新的位置就是重复字符第一次出现位置的下一个位置. 3)整个串可能没有一处重复. 那么,为了找出当前访问的字符是否出现过,要怎么做呢?当然是hash,O(1)的时间,而且既然是字符, 定义个255的hash table 就可以了,hash table 中的元素为相应字符在s中出现的位置.初始化为-1,表示都没有出现. 我们另外定义一个start 和end

leetcode -day21 Longest Substring Without Repeating Characters

 1.Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the

[LeetCode] 5. Longest Substring Without Repeating Characters 最长回文子串

[LeetCode] 5. Longest Substring Without Repeating Characters Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "babad" Output: "bab" Note: "aba&qu

[LeetCode][Python]Longest Substring Without Repeating Characters

# -*- coding: utf8 -*-'''__author__ = '[email protected]'https://oj.leetcode.com/problems/longest-substring-without-repeating-characters/ Given a string, find the length of the longest substring without repeating characters.For example, the longest s

[LeetCode][JavaScript]Longest Substring Without Repeating Characters

Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the lengt

Leetcode 3 Longest Substring Without Repeating Characters. (最长无重复字符子串) (滑动窗口, 双指针)

目录 问题描述 例子 方法 Leetcode 3 问题描述 Given a string, find the length of the longest substring without repeating characters. 例子 Example 1: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2: Input: &q

[LeetCode] 3. Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1.

Leetcode 03 Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

Java for LeetCode 003 Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst