1. 无重复字符最长子串
class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } int[] index = new int[128]; Arrays.fill(index, -1); // 滑动窗口大小 int cur = 0; // 扫描过程中的出现的最长无重复子串 int longest = 0; for (int i = 0; i < s.length(); i++) { if (index[s.charAt(i)] == -1) { // 没有重复子串,滑动窗口增大 cur++; } else { // 出现重复子串 longest = cur > longest ? cur : longest; // 从如果重复字符在滑动窗口中,将重复字符的下一个字符作为滑动窗口的起点 int interval = i - index[s.charAt(i)]; cur = interval > cur ? cur + 1 : interval; } index[s.charAt(i)] = i; } return longest > cur ? longest : cur; } }
2. 最长回文子串
class Solution { public String longestPalindrome(String s) { String result = ""; for (int i = 1; i < s.length(); i++) { // 出现多个连续相同字符时,会在该字符出现的第一次进行处理,将整个连续相同字符作为回文串中心 if (i - 1 >= 0 && s.charAt(i) == s.charAt(i - 1)) { continue; } // 以i为中心向左右扩散 int left = i - 1; int right = i + 1; // 处理多个重复字符为中心的情况, eg: abccba 需要以cc为中心进行扩散 while (right < s.length() && s.charAt(i) == s.charAt(right)) { right++; } while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } if (right - left - 1 > result.length()) { result = s.substring(left + 1, right); } } return result; } }