给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
这是一个经典的问题,通常被称为找出无重复字符的最长子串。这个问题可以使用滑动窗口的思想以及哈希表来解决。下面是用Java实现的代码:
import java.util.HashMap;
public class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;
int left = 0;
for(int i = 0; i < s.length(); i ++) {
if(map.containsKey(s.charAt(i))) {
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
max = Math.max(max, i-left+1);
}
return max;
}
}
这个代码首先检查字符串是否为空,如果为空,那么返回0。然后创建一个哈希表用来存储字符和它们在字符串中最后出现的位置。
我们通过遍历字符串,然后每次检查当前字符是否在哈希表中,如果在,就更新左边界。然后我们将当前字符和其位置放入哈希表中。
最后我们更新最大长度为当前索引减去左边界的长度再加1(即滑动窗口的长度)。重复这个过程直到遍历完整个字符串。最后返回最大长度就是答案。
哈希表
哈希表(在Java中常见的实现是HashMap)是一种非常高效的数据结构,可以在常数时间内(即O(1)时间)完成插入、删除和查找操作。这种高效是因为哈希表使用一个称为哈希函数的函数来计算数据应存储在哪个位置。
在这个问题中,我们需要知道一个字符最后出现的位置,并且需要频繁地查找这个信息。如果使用一个列表或数组来存储这个信息,那么每次查找都需要遍历整个列表或数组,这样的时间复杂度是O(n),其中n是列表或数组的长度,这是非常低效的。但如果使用哈希表,那么无论哈希表有多大,查找都只需要常数时间,这就大大提高了效率。
算法复杂度
"O(1)" 和 "O(n)" 是大O符号表示法的一部分,这是一种在计算机科学中表示算法复杂度(即执行时间或空间需求)的方式。大O符号描述的是算法性能随着输入数据规模增长的变化趋势。
- "O(1)" 表示常数时间复杂度。这意味着不论输入数据的规模(n)是多少,执行此操作所需的时间总是相同的。例如,在哈希表中查找一个元素就是 O(1) 的,因为不论哈希表有多大,查找一个元素所需要的步骤数量都是一样的。只需要计算该元素的哈希值,然后直接找到相应的存储位置。
- "O(n)" 表示线性时间复杂度。这意味着执行此操作所需的时间随着输入数据的规模(n)线性增长。例如,如果你需要在一个数组或链表中查找一个元素,最坏的情况可能需要检查数组或链表中的每一个元素,所以时间复杂度是 O(n)。
所以,当我们说一个操作是 O(1),意味着这个操作的时间或空间需求不随输入数据的大小增加而增加。而当我们说一个操作是 O(n),意味着这个操作的时间或空间需求会随着输入数据的大小线性增加。
浙公网安备 33010602011771号