給定一個字符串 “abccabd”,查找出沒有重複字符的字符串子串的最大長度。
主要應用了滑窗移動的思想,需要提前創建一個Hashset 集合來存儲字符串。
定義一個區間[i,j],i和j的初始值都爲0,開始每次j向右移動一格,判斷此時的字符是否在前面創建的Hashset中存在,如果不存在則將這個字符加入創建好的Hashset中,同時記錄此時的長度,與上一個記錄的長度比較取最大值。
當j向右移動一格找到的字符存在已有的集合中時,將逐漸移除這個集合中的前面的字符,直到移除了此時標記了的字符。
具體代碼如下
public class lengthOfLongestSubstring {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="aaabcbxfsasd";
System.out.println(lengthOfLongestSubstring(str));
}
private static int lengthOfLongestSubstring(String str) {
// TODO Auto-generated method stub
int len=0;
int strlength = str.length();
int i=0;
int j=0;
HashSet<Character> hs = new HashSet<Character>();
while(i<strlength&&j<strlength) {
if(!hs.contains(str.charAt(j))) {
hs.add(str.charAt(j++));
len =Math.max(len, j-i);
}else {
hs.remove(str.charAt(i++));
}
}
return len;
}
}
更新使用map來存儲數值,以達到簡化代碼的作用
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>();
for (int end = 0, start = 0; end < n; end++) {
char alpha = s.charAt(end);
if (map.containsKey(alpha)) {
start = Math.max(map.get(alpha), start);
}
ans = Math.max(ans, end - start + 1);
map.put(alpha, end + 1);
}
return ans;
}
}