查找最長無重複字符串子串編程問題

給定一個字符串  “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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章