Java蓝桥杯——子串分值和

该博客探讨了一道编程题,题目要求计算给定字符串所有非空子串的不同字符个数之和。现有代码由于三层循环导致时间复杂度过高,仅能通过一半的测试用例。优化方向可能包括动态规划或滑动窗口等方法,以降低时间复杂度,提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

对于一个字符串 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]) 的和是多少。

【样例输入】

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

【评测用例规模与约定】

对于 20% 的评测用例,1≤n≤10;
对于 40% 的评测用例,1≤n≤100;
对于 50% 的评测用例,1≤n≤1000;
对于 60% 的评测用例,1≤n≤10000;
对于所有评测用例,1≤n≤100000。                        //样例规模较大,要考虑时间超时问题


问题描述:


具体代码:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Number_n {
	static int ans = 0;
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String str = input.next();
		Set<Character> hs = new HashSet<Character>();
		for(int i = 0;i < str.length();i++){
			for(int j = i;j < str.length();j++){
				hs.clear();
				String temp = str.substring(i, j+1);
				for(int index = 0; index < temp.length();index++)
					hs.add(temp.charAt(index));
				ans += hs.size();
			}
		}
		System.out.println(ans);
	}
		
}


注意:

代码只能通过50%,应该是因为嵌套了三层循环,时间复杂度超时了,还没有解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值