栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2020蓝桥杯大赛软件类省赛第二场 Java 大学 B 组 子串分值和

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2020蓝桥杯大赛软件类省赛第二场 Java 大学 B 组 子串分值和

题目 试题 I: 子串分值和

时间限制: 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 【样例说明】

字串f值
a1
ab2
aba2
abab2
ababc3
b1
ba2
bab2
babc3
a1
ab2
abc3
b1
bc2
c1
【评测用例规模与约定】

对于 20% 的评测用例,1 ≤ n ≤ 10;对于 40% 的评测用例,1 ≤ n ≤ 100;对于 50% 的评测用例,1 ≤ n ≤ 1000;对于 60% 的评测用例,1 ≤ n ≤ 10000;对于所有评测用例,1 ≤ n ≤ 100000。 思路

使用动态规划定义一个一维数组dp,dp[i]:表示以当前字符结尾f(0…i)+f(1…i)…f(i)的和再定义一个一维数组pre[26],pre[i]:表示当前字符上一次出现的位置。找到状态转移方程: dp[i] = dp[i-1] + i - 1 - pre[s.charAt(i)-97] + 1;最后求出,所有的dp[i],把dp[i]全部相加,就是本题答案。 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String str = scanner.next();
		int n = str.length();
		long[] dp = new long[n];
		long res = 0;
		dp[0] = 1;
		res += dp[0];
		int[] pre = new int[26];
		Arrays.fill(pre, -1);
		for (int i = 0; i < n; i++) {
			if (i == 0) {
				pre[str.charAt(i)-97] = i;
			} else {
				if (pre[str.charAt(i)-97] == -1) {
					//代表当前位置字符前面都没有重复
                    //每位都在之前的位置上加1
                    //再加上当前新增这一位的字串
					dp[i] = dp[i-1] + i - 1 - 0 + 1 + 1;
					pre[str.charAt(i)-97] = i;
					res += dp[i];
				} else {
					//把当前字符前面没有重复的都加1,一共有(i - 1 - index)个
                    //再加上当前新增这一位的字符串
					int index = pre[str.charAt(i)-97];
					dp[i] = dp[i - 1] + i - 1 - index + 1;
					pre[str.charAt(i)-97] = i;
					res += dp[i];
				}
			}
		}
		System.out.println(res);
	}
}
最后要注意要使用long,int会超出范围。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号