每日一道算法题:寻找无重复字符的最长子串

290 阅读1分钟

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

思路1:暴力解法,把所有的字串都作检验,不推荐,时间复杂度太高 思路2:滑动窗口法,用两个指针界定一个窗口,窗口不停地向字符串末尾移动,hashMap记录下已经被窗口包含过的字符,当窗口到达末尾时候就能得出最长字符串的长度,(如果需要知道字符串是那一个,在计算的时候需要保存窗口的下标)

  public int getLongestSubString(String s) {
	int len = s.length();
	int res = 0;

	//key为字符,value为下标
	Map<Character, Integer> map = new HashMap();

	//i和j作为窗口的两个指针,map来存储窗口中的字符
	for (int i = 0, j = 0; j < len; j++) {

		if (map.containsKey(s.charAt(j))) {
			//没有移除map中已经使用过的字符,必须要比较
			i = Math.max(map.get(s.charAt(j)), i);
		}
		res = Math.max(res, j - i + 1);
		map.put(s.charAt(j), j + 1);
	}
	return res;
}

昨天切菜切到手指头了,选择早睡早起更新,一日之计在于晨啊,下一期是最长回文串或者是上一期留下的求两个有序数组的中位数

最长回文串: (后面补上解释)

    public String getLongestPalindrome(String s) {
	if (s == null || s.length() < 1) {
		return s;
	}

	int maxStart = 0;
	int maxEnd = 0;
	for (int i = 0; i < s.length(); i ++) {
		int len1 = getLongestByCenter(s, i ,i);
		int len2 = getLongestByCenter(s, i, i + 1);
		int len = Math.max(len1, len2);
		if (len > maxEnd - maxEnd) {
			maxEnd = i + len/2;
			maxStart = i - (len - 1)/2;
		}
	}
	return s.substring(maxStart, maxEnd + 1);


}

public int getLongestByCenter(String s, int left, int right) {
	while (left > 0 && right < s.length()
			&& s.charAt(left) == s.charAt(right)) {
		left --;
		right ++;
	}
	return right - left - 1;
}