栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

最长不含重复字符的子字符串(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最长不含重复字符的子字符串(C++)

最长不含重复字符的子字符串 描述

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

数据范围:s.length≤40000

示例1
输入:
"abcabcbb"
返回值:
3
说明:
因为无重复字符的最长子串是"abc",所以其长度为 3。
示例2
输入:
"bbbbb"
返回值:
1
说明:
因为无重复字符的最长子串是"b",所以其长度为 1。
示例3
输入:
"pwwkew"
返回值:
3
说明:
因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是子串的长度,"pwke" 是一个子序列,不是子串。 
思路/解法 方式一

每一个字符都比较与该字符前面字符是否重复,相同则更新起始标记位,同时每遍历一个字符都要获取当前的最长子字符串。

class Solution {
  public:
    
    int lengthOfLongestSubstring(string s) {
        // write code here
        if (s.size() == 0) {
            return 0;
        }
        int max = 1, begin = 0;

        for (int i = 0; i < s.size(); i++) {
            for (int j = begin; j < i; j++) {
                if (s[j] == s[i]) {
                    begin = j + 1;
                }

            }
            if (i - begin + 1 > max) {
                max += 1;
            }
        }
        return max;
    }
};
方式二

用一个容器存储字符的位置所在,同时设置两个标记位,分别指向当前不重复子字符串的起始位置以及当前遍历位置。遍历字符串的时候,如果发现之前出现过该字符,那么应该更新起始标记位,而且其实标记位必须在该重复字符的后一位置(注意,起始位置只能前进,不能往后退,所以需要判断一下大小),最后通过res获取整个字符串的最大子字符串。

class Solution {
public:
    
    int lengthOfLongestSubstring(string s) {
        if(s == " " || s.length() == 1)return 1;
        if(s.empty())return 0;
        vector visited(4000,0);
        int res = -1;
        int start = 0,end = 1;
        while(end < s.length())
        {
            if(s[start] == s[end])
                start++;
            else if(visited[s[end]] != 0)
            {
                if(start < visited[s[end]]+1)
                    start = visited[s[end]] + 1;
            }
            visited[s[end]] = end; 
            end++;
            if(end - start > res)
                res = end - start;
        }
        return res;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号