LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium

简介: 题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating let...

题目:

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.

解题思路:

  这个题让找一个字符串中具有不重复单词的最长子串的长度,如:ababc,子串为abc,长度为3。有这么几个方法:

方法一:

  依赖字符串本身的一些特有函数,进行相应操作来完成。我们可以维护一个子串,来保存最长的无重复的子串,并记录当前子串的长度,如果遇到重复的字符,则去掉子串中重复的字符,一次进行下去,最终就能找到最长无重复子串。如str = ababc, substr = a, ab, ba, ab, abc....类似这样的思路。如下代码:

//方法一:string only
int lengthOfLongestSubstring(string s)
{
    size_t j = 1;
    if (s.size() <= 1)
        return s.size();

    int len = 1, nMaxLen = 0;
    string subStr;
    subStr.push_back(s[0]);
    while (j < s.size()) {
        if (subStr.find(s[j]) == string::npos) {
            subStr.push_back(s[j]);
        }
        else {
            if (len > nMaxLen)
                nMaxLen = len;
            while (subStr.find(s[j]) != string::npos) {
                subStr.erase(0,1);
                len --;
            }
            subStr.push_back(s[j]);
        }
        len ++;
        j ++;
    }
    if (len > nMaxLen)
        nMaxLen = len;
    return nMaxLen;
}

 

方法二:

  指针法:用一个指针指向字符串的左边界,如果遇到重复的字符,就往后移动,同时用一个有26位的字符数组(因为总共就26个字符)来保存每一个字符最近一次出现的位置,以此来更新指针位置和字符位置之间的距离,就可以算出最长无重复字符的长度,如下代码所示:

 1 //方法二:pointer
 2 int lengthOfLongestSubstring2(string s) {
 3     int maxlen = 0, left = 0;
 4     int sz = s.length();
 5     int prev[26];
 6     memset(prev, -1, sizeof(prev));
 7 
 8     for (int i = 0; i < sz; i++) {
 9         if (prev[s[i]-'a'] >= left) {
10             left = prev[s[i]-'a'] + 1;
11         }
12         prev[s[i]-'a'] = i;
13         maxlen = max(maxlen, i - left + 1);
14     }
15     return maxlen;
16 }

 

方法三:

  hashtable法:该方法和方法二其实是同一个思路,只不过该方法我不用数组来存字符的位置,而是通过hashtable来存,进而提高效率。如下代码:

 1 //方法三:hash table
 2 int lengthOfLongestSubstring3(string s) {
 3     if(s.length()<2)
 4         return s.length();
 5     int max_len=0;
 6     map<char,int> sub; //hash map
 7     for(int i=0,j=0;i<s.length();++i){
 8         if(sub.find(s[i])!=sub.end()){
 9             j=max(j,sub[s[i]]+1);
10         }
11         sub[s[i]]=i;
12         max_len=max(max_len,i-j+1);
13     }
14     return max_len;
15 }

 

目录
相关文章
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
604 0
Leetcode第三题(无重复字符的最长子串)
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
161 0
|
存储 算法 程序员
力扣经典150题第三十一题:无重复字符的最长子串
力扣经典150题第三十一题:无重复字符的最长子串
116 0
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
177 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
255 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
168 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
364 2
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
268 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
338 1

热门文章

最新文章