剑指 offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
- s.length <= 40000
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution 1
快慢双指针,用哈希表存储两指针直接出现的字符
import java.util.*;
class Solution {
public int lengthOfLongestSubstring(String s) {
{
int start = 0, end = 0, max_len = 0;
// start指向不重复子串的开头,end指向不重复子窜的末尾
Map<Character, Integer> hashTable = new HashMap<>();
while (end < s.length()) {
Character key = s.charAt(end);
if (!hashTable.containsKey(key) || hashTable.get(key) == 0) {
hashTable.put(key, 1);
end++;
if (max_len < end - start)
max_len = end - start;
} else {
while (hashTable.get(key) == 1) {
hashTable.replace(s.charAt(start), 0);
start++;
}
}
}
return max_len;
}
}
}
Solution 2
cpp
#include <string>
using std::string;
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
bool map[128];
for (int i = 0; i < 128; i++)
map[i] = false;
int len = 0, maxLen = 0, start = 0, end = 0;
while (start < s.length() && end < s.length())
{
char c = s[end++];
while (map[c] == true)
{
map[s[start++]] = false;
len--;
}
map[c] = true;
len++;
if (len > maxLen)
maxLen = len;
}
return maxLen;
}
};