LeetCode.H828.统计子串中的唯一字符
题目:
题目大意:
如图所示。
数据范围:
如图所示
思路:
计算字符串中每一个字符对答案的贡献。
比如一个字符 ‘A’ ,下标为 i ,找到其左边第一个 ‘A’ 下标为 j (如果没有则为 -1),右边第一个 ‘A’ 下标为 k (如果没有则为 s.length())。则子串里只有一个 下标为 i 的 ‘A’ 的子串共有 (i - j) * (k - i) 个。(子串的左端点共有 j + 1 到 i 这 i - j 种选择,右端点共有 i 到 k - 1 这 k - i 种选择)。
代码:
class Solution {
public int uniqueLetterString(String s) {
Map<Character, List<Integer>> indexC = new HashMap<>();
for (int i = 0; i < s.length(); i ++ ){
char c = s.charAt(i);
if (!indexC.containsKey(c)) {
indexC.put(c, new ArrayList<>());
indexC.get(c).add(-1);
}
indexC.get(c).add(i);
}
int ans = 0;
for (Map.Entry<Character, List<Integer>> entry : indexC.entrySet()){
List<Integer> index = entry.getValue();
index.add(s.length());
for (int i = 1; i < index.size() - 1; i ++ ){
ans += (index.get(i) - index.get(i - 1)) * (index.get(i + 1) - index.get(i));
}
}
return ans;
}
}
时空复杂度分析等:
-
时间复杂度 : O(n)
-
空间复杂度 : O(n)