AcWing 2868. 子串分值(Java)
原题链接
中等
作者:
上杉
,
2021-03-11 09:51:19
,
所有人可见
,
阅读 596
Java 代码
代码写的比较粗糙,不想优化了,其实一边遍历字符串一边计算字符贡献也是可以的,但是那种写起来比较麻烦,这种比较简单暴力。
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String line = input.nextLine();
ArrayList<Integer>[] lists = new ArrayList[26];
//用一个list存放26个字母,每个出现的索引
for(int i = 0 ; i < 26 ; i ++){
lists[i] = new ArrayList<>();
lists[i].add(-1);//所有字符第一次出现的索引可以看作为-1
}
for(int i = 0 ; i < line.length() ; i++){
char c = line.charAt(i);
lists[c-'a'].add(i);
}
// long res = 0;
BigInteger bi = new BigInteger("0");
for(int i = 0 ; i < 26 ; i ++){
if(lists[i].size() == 1){
//字符一次都没出现过,没有贡献
continue;
}
lists[i].add(line.length());
long pre = -1;
long cur = lists[i].get(1);
for(int j = 2 ; j < lists[i].size(); j++){
long next = lists[i].get(j);
bi = bi.add(BigInteger.valueOf((cur - pre) * ( next - cur)));
pre = cur;
cur = next;
}
}
System.out.println(bi);
}
}