【演算法題】查詢字串中無重複最長子串的長度
在閱讀的過程中有任何問題,歡迎一起交流
QQ:1494713801
題目:輸入是一個字串,找出沒有重複字元的最長子字串的長度
示例:
“abcabcbb”最長子串(abc)長度為3
“bbbbbbb”最長子串(b)長度為1
“abdevbac”最長子串(bdev)長度4
演算法思想:
設定兩個下標標識,初始時都位於陣列的頭部,並設定一個HashSet。標識runner先往後走,並將經過的字元放入HashSet中,當存在重複的字元時停止移動;此時,標識walker在後面追,直到walker的字元和runner的字元相同為止,此時walker與runner之間的字元是無重複的字串,將長度記錄為max。進行一遍遍歷後可以得到最長字串的長度值。
時間複雜度:
兩個標識需要分別遍歷一遍,即2*N,故複雜度為:O(n)
程式碼實現:
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0)
return 0;
HashSet<Character> set = new HashSet<Character>();
int max = 0;
int walker = 0;
int runner = 0;
while(runner<s.length())
{
if(set.contains(s.charAt(runner)))
{
while(s.charAt(walker)!=s.charAt(runner))
{
set.remove(s.charAt(walker));
walker++;
}
if(max<runner-walker)
{
max = runner-walker;
}
walker++;
}
else
{
set.add(s.charAt(runner));
}
runner++;
}
max = Math.max(max,runner-walker);
return max;
}