
思路不难
就是分析每个c对用的下标,然后看看能延申的最长位置,左 * 右就是它的贡献
class Solution {
public int uniqueLetterString(String s) {
// 用一个HashMap记录每个字母对应的下标位置
// Character -> List
Map<Character, List<Integer>> ids = new HashMap();
// String的长度用length(), int[]的长度用length
for(int i = 0; i < s.length(); i++) {
// 找到对应下标的c
char c = s.charAt(i);
// 如果这个c对应有List就加,否则就先建立一个新的List再加
ids.computeIfAbsent(c, x -> new ArrayList<Integer>()).add(i);
}
// 看看左右的个数,补-1和补n
int ans = 0;
for (List<Integer> lst: ids.values()) {
// ArrayList写size()
for (int i = 0; i < lst.size(); i++) {
int prev = i > 0 ? lst.get(i - 1) : -1;
int next = i < lst.size() - 1 ? lst.get(i + 1) : s.length();
ans += (lst.get(i) - prev) * (next - lst.get(i));
}
}
return ans;
}
}
首先Map来记录每个c对应idx下标
Character用来记录字符, 然后List用来存下标 HashMap是Map的一种实现
对于String,用length()获取长度, charAt获取第i个的值
然后对于map而言,使用computeIfAbsent如果有key就直接对value操作,否则创建一个新的value
这里的话index.computeIfAbsent(c, x-> new ArrayList()).add(i);
要用x-> new ArrayList()这种写法,x可以替换为任意东西
然后同样地,如果想遍历Map的值就是用idx.values()
可以用直接遍历的方法遍历values:for (List A: index.values()),注意这里要把数据类型标注好
对于List的话用size()获取长度
然后通过get(i)获取第i个元素的值
Map的操作 HashMap的定义 computeIfAbsent更新新的values
String的操作 用charAt
对于List 使用get方法可以找元素