子串分值和
问题分析
时间限制: 1.0s
内存限制: 512.0MB
本题总分:25 分
【问题描述】
对于一个字符串 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 。
【输出格式】
输出一个整数表示答案。
【样例输入】
ababc
【样例输出】
28
【样例说明】
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 10;
对于 40% 的评测用例,1 ≤ n ≤ 100;
对于 50% 的评测用例,1 ≤ n ≤ 1000;
对于 60% 的评测用例,1 ≤ n ≤ 10000;
对于所有评测用例,1 ≤ n ≤ 100000。
解决代码
import java.util.Scanner;
public class dd {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str = input.nextLine();
int sum = 0;
int aa = 0;
int mm = 0;
for(int i = 0;i<str.length();i++){
String str1 = str.substring(i,str.length());
mm = kk(str1);
aa = gg(str1,mm);
sum = sum+aa;
}
System.out.println(sum);
}
public static int gg(String str,int mm){
if(str.length()>1){
String str1 = str.substring(0,str.length()-1);
mm=gg(str1,mm);
mm=mm+kk(str1);
}
return mm;
}
public static int kk(String s){
char[] aa = new char[26];
char q= 'a';
for(int i =0 ;i<aa.length;i++){
aa[i]=q;
q++;
}
char[] x = s.toCharArray();
int he=0;
for(int i =0 ;i<x.length;i++){
xx: for(int j =0 ;j<aa.length;j++){
if(x[i]==aa[j]){
aa[j]='0';
he++;
break xx;
}
}
}
return he;
}
}