Leetcode 1624 两个相同字符之间的最长子字符串

2022-01-05  本文已影响0人  itbird01
题目.png

题意:给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1 。
子字符串 是字符串中的一个连续字符序列。

解题思路

解法:
1.分析题意,理解题意,问题转化为,求取哪两个相同字符之间的长度是最长的
2.遍历s,以map存储数据,key为每个字符,value为list,为每个字符出现的位置
3.遍历map,对于每个字符,排序list,求取第一个和最后一个index之差

解题遇到的问题

1.此题也可以用滑动窗口算法思想来解决,head、tail
2.解法1中,其实一次遍历hash即可得到结果

后续需要总结学习的知识点

##解法1
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

class Solution {
    public int maxLengthBetweenEqualCharacters(String s) {
        // 分析题意,理解题意,问题转化为,求取哪两个相同字符之间的长度是最长的
        // 遍历s,以map存储数据,key为每个字符,value为list,为每个字符出现的位置
        HashMap<Character, List<Integer>> map = new HashMap<Character, List<Integer>>();
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(s.charAt(i))) {
                List<Integer> k = map.get(s.charAt(i));
                k.add(i);
            } else {
                List<Integer> k = new ArrayList<Integer>();
                k.add(i);
                map.put(s.charAt(i), k);
            }
        }
        // 遍历map,对于每个字符,排序list,求取第一个和最后一个index之差
        int max = -1;
        Iterator<Entry<Character, List<Integer>>> iterator = map.entrySet()
                .iterator();
        while (iterator.hasNext()) {
            Entry<Character, List<Integer>> entry = iterator.next();
            List<Integer> list = entry.getValue();
            Collections.sort(list);
            int k = Math.abs(list.get(0) - list.get(list.size() - 1)) - 1;
            if (list.size() >= 2 && k >= 0) {
                max = Math.max(max, k);
            }
        }
        return max;
    }
}
上一篇下一篇

猜你喜欢

热点阅读