题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
思路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;
}