public int uniqueLetterString(String s) {
char[] cs = s.toCharArray();
int n = cs.length, ans = 0;
int[] l = new int[n], r = new int[n];//存储某个字符左右最近相同字符的位置
int[] idx = new int[26];//记录最近一次某个字符出现位置
Arrays.fill(idx, -1);
for (int i = 0; i < n; i++) {
int u = cs[i] - 'A';
l[i] = idx[u];//查询左边最近相同字符的位置
idx[u] = i;//更新当前字符出现位置
}
Arrays.fill(idx, n);
for (int i = n - 1; i >= 0; i--) {
int u = cs[i] - 'A';
r[i] = idx[u];
idx[u] = i;
}
//对于某个字符,枚举包含该字符的前缀及后缀,相乘可得到包含该字符的所有子串
//如果前后缀至少一个包含两个相同该字符,那么该字符不计数
//所以前后缀其他位置不能出现该字符,因此由l和r来计算前后缀数量并相乘
for (int i = 0; i < n; i++) ans += (i - l[i]) * (r[i] - i);
return ans;
}
2022.9.6-----leetcode.828
最新推荐文章于 2024-07-25 11:38:39 发布