題目**
請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。
思路:dp
dp[i]表示以s[i]結尾的最長不重複子串的長度
設dp[i-1]=k
如果在s[i-k]....s[i-1]中都不存在s[i],dp[i]=dp[i-1]+1
如果在s[i-k]....s[i-1]中存在s[j]=s[i],dp[i]=i-j
在遍歷過程中用乙個變數max記錄整個串不重複子串的最大長度
判斷s[i-k]....s[i-1]中存不存在s[j]=s[i]
,需要再往前搜尋
public int lengthoflongestsubstring(string s)
int dp=new int[s.length()];
dp[0]=1;
int max=1;
for (int i = 1; i < dp.length; i++)
if(j==i-dp[i-1])
}max=math.max(max,dp[i]);
}return max;
}
時間複雜度o(n2),空間複雜度o(n)
優化:
public int lengthoflongestsubstring(string s)
int map=new int[128];
arrays.fill(map,-1);//-1表示未出現
map[s.charat(0)]=0;
int max=1;
int temp=1;//前乙個位置最大長度
for (int i = 1; i < s.length(); i++) else
int max=1;
int low=0;
int high=1;
while (high=0)
high++;
max=math.max(max,high-low);
}return max;
}
時間複雜度o(n2),空間複雜度o(1)
用雜湊表優化滑動視窗
public int lengthoflongestsubstring(string s)
int max=1;
int low=0;
int high=1;
int map=new int[128];
arrays.fill(map,-1);
map[s.charat(0)]=0;
while (high=0)
high++;
max=math.max(max,high-low);
}return max;
}
時間複雜的o(n),空間複雜度o(1) 最長不含重複字元的子字串
題目 輸入乙個字串,找出字串中最長的不含重複字元的子字串,計算該子字串的長度。假設字串中的字元為 a z 例如 arabcacfr 最長的字串為 rabc 和 acfr 長度為 4 int find max len string str else dp str i a i return max le...
最長不含重複字元的子字串
題目 請從字串中找出乙個最長的不包含重複字元的子 字串,計算該最長子字串的長度。假設字串中只包 含 a z 的字元。例如,在字串 arabcacfr 中,最長的不含重複字元 的子字串是 acfr 長度為 4。分析 f i 表示第i個字元為結尾的不包含重複字元的子字串的最大長度。如果第i個字元之前沒有...
最長不含重複字元的子字串
請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從 a 到 z 的字元。例如,在字串中 arabcacfr 最長非重複子字串為 acfr 長度為4。暴力,o n o n 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...