leetcode 3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
题解:
1.一串字符串
2.找出其中不含有重复字符的最长子串
3.返回长度
4.子串是连续的,任何字符
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
(1)哈希表+双指针
-
哈希表存放所有可输入字符,下标表示字符,值表示出现次数
-
附设左右指针,遍历字符
-
左指针指向子串左下标位置,右指针指向右下标位置,子串长度为:右指针 - 左指针 + 1
-
遍历中,如果没有出现重复字符,右指针一直向后移动,左指针不变
-
如果出现重复字符,右指针指向子串右位置。左指针移动到重复字符初次出现位置的下标位置
-
在上述子串中总是比较出子串长度最长的值
(2)双指针
-
左指针每次向后移动一个位置,而右指针向后移动直到出现重复字符为止,记录比较找到的子串长度取长度更长的子串
-
左指针向后移动一个位置再重复以上过程,直到左指针到达串尾
C/C++题解:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.length() == 0) return 0;
vector<int> index(256, -1);//
int L = 0, R = -1, res = 0;
while(R + 1 < s.length()){
R++;//遍历指针向后移动
if(index[s[R]] != -1)//如果出现重复字符
L = max(L, index[s[R]]+1);//左索引为当前最多重复次数
index[s[R]] = R; //遍历到一个字符,字符出现次数记录在相应位置
res = max(res, R - L + 1);}
//没有重复字符,左指针不动,右指针一直后移,字符串长度即R-L+1
//出现重复字符,右指针在当前元素位置,左指针移动到重复字符初次出现位置的下一位置
return res;}};
Debug结果:
Java题解:
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) return 0;
char[] chs = s.toCharArray();
int[] index = new int[256];
int L = 0, R = -1, res = 0;
Arrays.fill(index, -1);
while (R + 1 < s.length()) {
R++;//遍历指针向后移动
if(index[chs[R]] != -1) //如果出现重复字符
L = Math.max(L, index[chs[R]]+1); //左索引为当前最多重复次数
index[chs[R]] = R;
res = Math.max(res, R - L + 1);}
//没有重复字符,左指针不动,右指针一直后移,字符串长度即R-L+1
//出现重复字符,右指针在当前元素位置,左指针移动到重复字符初次出现位置的下一位置
return res;}}
Debug结果:
Python题解:
class Solution(object):
def lengthOfLongestSubstring(self, s):
""":type s: str:rtype: int"""
if len(s) == 0: return 0
index = {}
L, res = 0, 0
for R, ch in enumerate(s):
if ch in index and index[ch] >= L:#如果出现重复字符
L = index[ch]+1 #左索引为当前最多重复次数
index[ch] = R #遍历到一个字符,字符出现次数记录在相应位置
res = max(res, R - L + 1)
#没有重复字符,左指针不动,右指针一直后移,字符串长度即R-L+1
#出现重复字符,右指针在当前元素位置,左指针移动到重复字符初次出现位置的下一位置
return res
Debug结果:
例题来自力扣网https://leetcode-cn.com/
针对思路二:
class Solution(object):
def lengthOfLongestSubstring(self, s):
""":type s: str:rtype: int"""
if s == " ": return 1
first = second = 0
length = second - first
while first < len(s):#左指针每次向后移动一个位置
tmp = [] #临时结果容器,如果返回子串用处较大
while second < len(s):#右指针
if s[second] not in tmp:#无重复
tmp.append(s[second])
second = second + 1
length = max(length, len(tmp))
else:#在里面说明有重复
second = first
break
first += 1
return length