最長不含重複字元的子字串

2021-10-11 15:55:12 字數 1879 閱讀 4103

題目**

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。

示例 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 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...