题目描述
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中出现的不同的字符个数。例如 f(“aba”)=2,f(“abc”)=3,f(“aaa”)=1。
现在给定一个字符串 S[0...n?1](长度为 n),请你计算对于所有 S 的非空子串S[i ... j] (0 ≤ i ≤ j < n ),f(S[ i...j ]) 的和是多少。
输入描述
输入一行包含一个由小写字母组成的字符串 S。
其中,1 ≤ n ≤ 。
输出描述
输出一个整数表示答案。
输入输出样例
示例 1
输入:
ababc
输出:
28
运行限制
解题思路:
? ? ? ? 这是一道考数学方面的算法题,该题主要抓住规律即可求解。对每一次的子串可以发现规律:
? ? ? ? ?对于字符串 ababc 来说,出现的次数为 5 次,均在以 a 为开头的字串中,以此分析下去可以发现每一个字符在对应字串中出现的规律,可以设计处解题算法。该算法的 Java 实现如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.next();
int[] logo = new int[26];
long sum = 0;
int i, j, len = s.length();
for (i = 0; i < logo.length; i++) {
logo[i] = -1;
}
for (i = 0; i < s.length(); i++, len--) {
sum += (i - logo[s.charAt(i) - 'a']) * len;
logo[s.charAt(i) - 'a'] = i;
}
System.out.println(sum);
scan.close();
}
}
? ? ? ? 但是蓝桥杯练习系统给出的十个例子中却有两个通过不了,显示答案错误。若有大佬看出这个程序哪里有问题的话希望可以不吝赐教!感谢!
|