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;
}
}