今天继续刷LeetCode,第3题,找出字符串中最长的无重复子串长度。
分析:
方法一:既然需要找到无重复的,那么就可以设置一个标志数组,用来判断子字符串中是否包含当前要包含的字母,如果存在重复就更新最大长度,重新开始遍历,直到遍历完整个。
方法二:采用滑动窗口的方式,动态更改窗口大小。
问题:
1、代码优化方面,可以只用一次循环完成;
2、滑动窗口的使用。
附上C++代码1:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.length();
int max_length=0;
for(int i=0;i<n;i++)
{
vector<int> t(256,-1);
int length=0;
for(int j=i;j<n;j++)
{
if(t[s[j]]>-1)
{
break;
}
else
{
length++;
t[s[j]]++;
}
}
max_length=max(length,max_length);
}
return max_length;
}
};
附上C++代码2:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];
dict[s[i]] = i;
maxLen = max(maxLen, i - start);
}
return maxLen;
}
};
附上Python代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
tem=0
d={}
start=0
for i in range(len(s)):
if s[i] in d and start<=d[s[i]]:
start=d[s[i]]+1
tem=max(tem,i-start+1)
d[s[i]]=i
return tem
博客围绕LeetCode第3题展开,旨在找出字符串中最长的无重复子串长度。介绍了两种方法,一是用标志数组判断子串是否有重复字母,二是采用滑动窗口动态更改窗口大小。还提及代码优化可一次循环完成及滑动窗口使用,并附上C++和Python代码。
555

被折叠的 条评论
为什么被折叠?



