问题描述
对于一个字符串 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
样例说明
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
这道题我是受到样例说明的启发,采取的是逐步切分字符串然后利用类Set进行去重,代码如下:
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner((System.in));
String str = sc.next();
Set<String> set = new HashSet<>();
int sum = 0;
for (int i = 0; i < str.length(); i++) {
for (int j = i; j < str.length(); j++) {
String subStr = str.substring(i, j + 1);
set.clear();
for (int k = 0; k < subStr.length(); k++) {
set.add(subStr.charAt(k) + "");//chat类型转化为String类型
}
sum += set.size();
}
}
System.out.println(sum);
}
}
代码没多长,但是却用的是暴力破解,这里还没想到其他的好的方法。
加油!!!
奥利给!!!
|