博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.无重复字符的最长字串
阅读量:6988 次
发布时间:2019-06-27

本文共 1208 字,大约阅读时间需要 4 分钟。

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例 1:

输入: "abcabcbb"

输出:

解释: 无重复字符的最长子串是 "abc",其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

 

主要思想:“滑动窗口”,使用一个容器保存遍历的字符。

遍历字符串,同时将不重复的字符保存到窗口中,窗口的右边界加一,相当于向右滑动了一位;当遇到重复字符时,就从窗口的左边界缩小窗口大小,直到容器中不包括该重复字符。本质上也是借助外部空间。

 

解法1:

int lengthOfLongestSubstring(string s){    int n = s.size();    unordered_set
set; int max = 0, i = 0, j = 0; while (i < n && j < n) { auto f = set.find(s.at(j)); if (f == set.end()) { // 右边界向右滑动一位 set.emplace(s.at(j++)); max = std::max(max, j - i); } else { // 左边界向右缩小一位 set.erase(s.at(i++)); } } return max;}

 

解法2:

int lengthOfLongestSubstring(string s)    {        int n = s.size();        unordered_map
mp; int max = 0; for (int j = 0, i = 0; j < n; ++j) { if (mp.count(s.at(j)) > 0) { // 直接将窗口的左侧缩小成重复的字符的下一位 i = std::max(mp.at(s.at(j)), i); } max = std::max(max, j - i + 1); // 右边界向右滑动一位 mp.emplace(s.at(j), j + 1); } return max; }

 

转载于:https://www.cnblogs.com/jimobuwu/p/9755395.html

你可能感兴趣的文章
α冲刺 (6/10)
查看>>
Xcode7 低版本iOS系统上下有黑边的问题
查看>>
数据库查询集与反射的应用(自己写的小例子)
查看>>
关于exchange数据库无法装载问题分析处理
查看>>
nginx配置之一堆without
查看>>
iOS 系统架构及常用框架
查看>>
(毕业)上海行
查看>>
Nginx 源码学习资料
查看>>
Postfix 删除队列中的邮件
查看>>
我的友情链接
查看>>
GTK+Glade3 Gtk-WARNING **: Could not find signal handler 问题最终解析
查看>>
证书??
查看>>
JAVA兼职架构师
查看>>
Linux 进程和作业管理
查看>>
CSS布局标准
查看>>
Centos在VMware虚拟机上的网络配置一记
查看>>
Cap12_项目采购管理
查看>>
ptmalloc2源码解析初探
查看>>
用为知笔记发博客
查看>>
[转] WINCC教学视频
查看>>