LeetCode!! 3. Longest Substring Without Repeating Characters

news/2024/11/29 22:30:13/

参考资料:左程云算法课

3. Longest Substring Without Repeating Characters
Given a string s, find the length of the longest substring without repeating characters.Example 1:Input: s = "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:Input: s = "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:Input: s = "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.Constraints:0 <= s.length <= 5 * 104
s consists of English letters, digits, symbols and spaces.

思路:
首先,以str[i]为例,计算 局部最优解 以str[i]为结尾的无重复字符的最长子串的长度。然后,遍历字符串,即i取0,1,…, n-1,取局部最优解的最大值,得到全局最优解。
具体地,求 以str[i]为结尾的无重复字符的最长子串的长度,可以使用动态规划的方法。
dp[i]表示 以str[i]为结尾的无重复字符的最长子串的长度
以str[i]为结尾的无重复字符的子串不停地向左扩,直到扩不动了为止。扩不动的原因有两个:
第一,碰到了与str[i]相同的字符;
第二,碰到了dp[i-1]的局部最优解对应的开头的前一个位置,也就是令dp[i-1]扩不动的地方。
上面两个位置取最大,就是 令 以str[i]为结尾的无重复字符的子串 向左扩不下去的地方。此时,可以求得dp[i]。

一些实现细节:
使用数组map记录,遍历到i字符时,之前的所有字符最近出现过的位置。
注意:“还没出现过”的位置不能使用默认值0,而是指定为-1.
这是因为,‘0’ 已经有自己的含义了,如map['a']=0表示字符’a’最近一次出现是在0位置。

// 写法1:有dp表的动态规划public int lengthOfLongestSubstring3(String s) {if(s==null || s.length()==0){return 0;}char[] chs = s.toCharArray();int n=chs.length;int[] dp = new int[n];dp[0]=1;int[] map = new int[256];for(int i=0;i<256;i++){map[i]=-1;}map[chs[0]]=0;int res=1;for(int i=1;i<n;i++){dp[i] = i-Math.max(map[chs[i]],i-1-dp[i-1]);// Math.max(map[chs[i]],i-1-dp[i-1])是 局部最优开头的前一位的坐标if(dp[i]>res){res=dp[i];}map[chs[i]]=i;}return res;}// 写法2:省去了dp表,只使用有限几个变量,因为dp[i]在dp表中只依赖dp[i-1]public int lengthOfLongestSubstring(String s) {if(s==null || s.length()==0){return 0;}char[] str = s.toCharArray();int n = str.length;int[] map = new int[256];for(int i=0;i<n;i++){map[str[i]]=-1;}int pre = -1;int cur=1;int res=1;map[str[0]]=0;for(int i=1;i<n;i++){pre = Math.max(pre,map[str[i]]);cur = i-pre;res = cur>res?cur:res;map[str[i]]=i;}return res;}// 写法2: 和上面一样的写法,这里有些注释,可供参考public int lengthOfLongestSubstring2(String s) {if(s==null || s.length()==0){return 0;}char[] str = s.toCharArray();int[] map=new int[256];// <char,position>for(int i=0;i<256;i++){map[i]=-1; // 因为‘0’已经有含义了,它表示 the first index// 所以我们选择另外一种数字表示 “还没出现过”}// LSs who ends up with [i], //  pre : dp[i-1]'s previous index of its locally optimal startint pre = -1;int cur = 0;// local optint ans=cur;// global optfor(int i=0;i<str.length;i++){pre = Math.max(pre,map[str[i]]);cur = i-pre;map[str[i]]=i;ans = Math.max(ans,cur);}return ans;}

http://www.ppmy.cn/news/348730.html

相关文章

Geeks3D FurMark v1.26 显卡压力测试工具中文便携版带GPU-Z

前言 Geeks3D FurMark 是一款显卡压力测试工具&#xff0c;显卡性能测试软件&#xff0c;由oZone3D.net网站开发&#xff0c;通过皮毛渲染算法来衡量显卡的性能&#xff0c;同时还能借此考验显卡的稳定性&#xff0c;最低要求NVIDIA GeForce FX系列、ATI Radeon 9600系列、S3 …

furmark烤机工具设置中文教程

furmark是一款非常专业的显卡测试工具&#xff0c;但是不少用户下载打开发现竟然是英文版的&#xff0c;有什么办法可以设置中文&#xff0c;方便使用吗&#xff1f;针对这个问题&#xff0c;下面小编就给大家讲讲furmark设置中文的方法。 FurMark软件安装后打开程序&#xff0…

UG\NX二次开发 头文件及描述

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UG\NX二次开发 头文件及描述 头文件描述uf.hUG OPEN API的公共类型和函数定义

如何在ubuntu上写一个类似sl跑火车指令,“跑甜甜圈”

如何在ubuntu上写一个类似sl跑火车指令&#xff0c;“跑甜甜圈” 首先创建.c文件 #include <stdio.h> #include <math.h> #include <string.h> #include <unistd.h>int main() {float A 0, B 0;float i, j;int k;float z[1760]; //array to store…

3dmark压力测试 linux,拷机还用Furmark? 瞧瞧3DMark压力测试怎样玩

在以前我们对于硬件的稳定性都相当的重视&#xff0c;特别是DIY组装的电脑或多或少都有些兼容性的问题&#xff0c;所以我们都会用一些拷机软件来检验一下平台的稳定性。而随着电脑硬件性能以及兼容性不断提升&#xff0c;硬件兼容性已经不是问题&#xff0c;但追求高性能的玩家…

显卡烤机软件furmark详细烤机教程

furmark是一款出名的显卡烤机软件&#xff0c;提供了多种测试选项&#xff0c;通过皮毛渲染算法来衡量显卡的性能。还有很多用户不清楚furmark怎么烤机&#xff0c;下面小编就带来详细的烤机设置教程。 furmark怎么烤机&#xff1f; 1、单卡烤机模式&#xff1a;运行软件&#…

oZone3D FurMark(甜甜圈furmark显卡压力测试软件)绿色单文件版V1.9.2 | 电脑烤机测试软件

FurMark是来自oZone3D开发的一款OpenGL基准测试工具&#xff0c;通过皮毛渲染算法来衡量显卡的性能&#xff0c;可以对显卡进行地狱一般的折磨&#xff0c;借此考验显卡的稳定性&#xff0c;就是大家常说的显卡压力测试软件&#xff0c;俗称甜甜圈furmark&#xff0c;甜甜圈fur…

afterburner功耗限制调不了_为啥我的MSIAfterburner很多项都拖不了

公告&#xff1a; 为响应国家净网行动&#xff0c;部分内容已经删除&#xff0c;感谢读者理解。 话题&#xff1a;为啥我的MSI Afterburner很多项都拖不了回答&#xff1a;需要VBIOS才能上限.不知道你的显卡是什么版本&#xff0c;新前请核对版本号.670mx你要让我如何吐槽啊&am…