Leetcode解题
程序员文章站
2022-05-20 10:56:50
...
3.Longest Substring Without Repeating Characters
[题目连接]https://leetcode.com/problems/longest-substring-without-repeating-characters/hints/
1.暴力解决方法
1.1思路
双重循环,内部循环用于查找前面与正在处理的i相同的元素,如果在i的前面查找到一个下标为j的元素,那么j之前的元素及j以后就不用考虑包含进入结果了,设置index = j+1, 在i之前如果找到一个 与i相同的字符即可跳出这次内部循环查找,下次内部查找循环开始的位置为index。如果j与i位置是不相等的字符串,则记录下j 字符到i 处位置字符的长度,并与上一次的最大max进行比较
代码块语法遵循标准markdown代码,例如:
1.2代码
public class LongestSubstringWithoutRepeating {
public int solution(String s)
{
//暴力解决方法,初始化为max =1,包含第一个字符串
int index = 0,max = 1,len = s.length();
if(len==0)
return 0;
if(len==1)
return 1;
for(int i=1;i<len;++i)
{
for(int j=i-1;j>=index;--j)
{
if(s.charAt(i)==s.charAt(j)) {
index = j + 1;//相等情况下,不考虑更新max
//0到index-1是不再需要考虑的元素
break;//跳出整个循环语句, 转到处理下一个字符i,前面的不能在博阿凯
}
else//不相等情况下如何
{
if(max<i-j+1)
max = i -j +1;
}
}
}
return max;
}
}
2.hashmap记录结构
2.1思路
采用一个hashmap结果记录上次与i字符相同的元素的位置, 比如 abcdbe, 当处理第二个b时,判断hashmap是否包含b了,如果包含,取出第一个b的位置下表j。这样时间复杂度为O(N), 空间复杂度为O(1)
2.2代码
public int solution_2(String s)
{
//比上面更加情况
if(s.length()==0) return 0;
Map<Character, Integer> map =new HashMap<Character, Integer>();
int max =0;
for(int i=0,j=0;i<s.length();++i) {
if (map.containsKey(s.charAt(i)))
//j是同一个字符出现的位置前面上面的一点的位置
//在这里 j是不相等前面的元素
j = Math.max(j, map.get(s.charAt(i)) + 1);
//如果存在,求出最大值
//如果不存在的话,直接put到上面,更新操作,
map.put(s.charAt(i), i);
max = Math.max(max, i - j + 1);
}
return max;
}
下一篇: leetcode543二叉树的直径
推荐阅读
-
Leetcode算法【114. 二叉树展开为链表】
-
LeetCode 50. Pow(x, n)
-
[leetcode]不同路径三连击~
-
LeetCode——Department Highest Salary(花式使用IN以及GROUP BY)
-
LeetCode——Department Top Three Salaries(巧妙使用子查询)
-
LeetCode——Customers Who Never Order(灵活使用NOT IN以及IN)
-
leetcode 921. 使括号有效的最少添加(Python)
-
#leetcode刷题之路13-罗马数字转整数
-
#leetcode刷题之路48-旋转图像
-
#leetcode刷题之路46-全排列