About 2 min


无重复字符的最长子串

滑动窗口,[b, i] 为不重复子串。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] cs = s.toCharArray();
        int max = 0;
        // [b, i] 即为不重复子串
        int b = 0;      // 滑动窗口左边界,不重复子串的索引起始处
        HashMap<Character, Integer> map = new HashMap<>();   // 存字符的最新位置。
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            // 如果没存,那存。如果存了,就更新b的位置
            // 注意更新是:大了才更新,因为可能当前字符是老字符,已经被包含了。
            // "abba",到第二个b时,b是1 + 1 = 2;到第二个a时,0+1=1,不该更新。
            Integer pos = map.get(c);
            if (pos != null) {
                b = Math.max(pos + 1, b);
            }
            map.put(c, i);
            max = Math.max(max, i - b + 1);
        }
        return max;
    }
}

将HashMap换成手动字典,没什么大用

// 3. 无重复字符的最长子串
// 2ms
class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] cs = s.toCharArray();
        int max = 0;
        int b = 0;      // 滑动窗口左边界
        int[] map = new int[200];    // HashSet
        Arrays.fill(map, -1);   
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            int c_index = c;
            if (map[c_index] != -1) {
                b = Math.max(map[c_index] + 1, b);
            }
            map[c_index] = i;
            max = Math.max(max, i - b + 1);
        }
        return max;
    }
}

找到字符串中所有字母异位词

全是小写字母,那就搞new int[26],记录个数。

滑动窗口,比较数组Arrays.equals()

// 438. 找到字符串中所有字母异位词
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> result = new ArrayList<>();
        if(p.length() > s.length()){
            return result;
        }

        char[] cs = s.toCharArray();
        char[] cp = p.toCharArray();

        int[] ip = new int[26];
        int[] is = new int[26];
        
        for (int i = 0; i < cp.length; i++) {
            char c = cp[i];
            ip[c - 'a']++;
            c = cs[i];
            is[c - 'a']++;
        }

        if (Arrays.equals(ip, is)) {
            result.add(0);
        }

        for (int i = cp.length; i < cs.length; i++) {
            char c = cs[i - cp.length];
            is[c - 'a']--;

            c = cs[i];
            is[c - 'a']++;

            if (Arrays.equals(ip, is)) {
                result.add(i - cp.length + 1);
            }
        }
        return result;
    }
}