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