给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
自己想当然的用了两个循环做,结果毫无悬念,超时。。。。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0){
return 0;
}
String maxStr = "";
String maxStr2 = maxStr;
int mark = 1;
String str = maxStr;//当前字符串
for(int j=0;j<s.length();j++){
for(int i=j;i<s.length();i++){
if(str.contains(s.charAt(i)+"")){
if(mark>maxStr.length()){
maxStr = str;
}
mark =1;
str = s.charAt(i)+"";
}else{
str += s.charAt(i);
mark +=1;
if(str.length()>maxStr.length()){
maxStr = str;
}
}
}
maxStr2 = maxStr.length()>maxStr2.length()?maxStr:maxStr2;
maxStr = "";
str = "";
}
return maxStr2.length();
}
}
我不服,还真的有暴力解决不了的问题?
class Solution {
public int lengthOfLongestSubstring(String s) {
int mark = 0;
for(int i=0;i<s.length();i++){
for(int j=0;j<s.length();j++){
if(isUnique(s,i,j)){
mark = Math.max(mark,j-i+1);
}
}
}
return mark;
}
public boolean isUnique(String s,int start,int end){
String str = "";
for(int i=start;i<=end;i++){
if(str.contains(s.charAt(i)+"")){
return false;
}
str += s.charAt(i)+"";
}
return true;
}
}
然后…哈哈哈哈 时间复杂度还是O(n^3),结果和上面一样的啊。。。
然后提交的时候丢了n行这么个样例,直接气哭????
“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!”#%&’()*+,-./:;<=>(这个样例还有n行这么一长串的字符串,自然而然的就爆掉了。。。)
小弟智商不高,加上没刷过题,只能去看题解了。。。。
看了题解,第一个题解是暴力就不说了,它的暴力time也是O(n^3),和我上面写法一个意思,应该也没法A吧(没提交过题解里暴力法的代码)
第二个,使用滑动窗口(第一次看到这个名词,但很好理解)…看了一遍这个题解后照着这个思路写出来A了
class Solution {
public int lengthOfLongestSubstring(String s) {
int mark = 0,i=0,j=0;
while(i<s.length()&&j<s.length()){
if(isUnique(s,i,j)){
mark = Math.max(mark,j-i+1);
j++;
}else{
i++;
}
}
return mark;
}
public boolean isUnique(String s,int start,int end){
String str = "";
for(int i=start;i<=end;i++){
if(str.contains(s.charAt(i)+"")){
return false;
}
str += s.charAt(i)+"";
}
return true;
}
}
虽然A了,不过结果不太好,耗时一秒多,这也太gay了吧!!!
到最后了,上一个在评论里看到的代码吧,真是人比人气死人!!!!
简直是神仙代码,和最后一个优化了的题解是一个思路,不过这个老哥是用python写的,
刚开始我还看不懂,后面翻题解翻到最后一个优化解,官网给了解释才看懂。。。。
最后这个代码我只是看看,看懂了就没有动手写了,毕竟自己的思维目前还没达到这么高,我还在考虑怎样才能暴力不超时的时候,大佬就已经最优A了
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
st = {}
i, ans = 0, 0
for j in range(len(s)):
if s[j] in st:
i = max(st[s[j]], i)
ans = max(ans, j - i + 1)
st[s[j]] = j + 1
return ans;