子串分值和

子串分值和 - 蓝桥云课 (lanqiao.cn)

分析:

  1. 考虑每个字符在多少种子串中有价值,即在多少种子串中时第一次出现,第一次出现可能出现在任何位置(开头,中间,最后)
  2. 用last[]来记录他最后出现的位置,到第i个字符时,包含它的子串的起点可能i-last[s[i]]中的任何一个,起点有i-last[s[i]]种,终点可能是包含他以及它后面的任何位置,终点有n-i+1种,则包含他的子串有sum=(i-last[s[i]])*(n-i+1)种,则它在sum个子串中每个提供一点价值
public class N1037 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String s = scanner.next();
		int len = s.length();
		char[] ch = s.toCharArray();
		int[] last = new int[1000];
		long sum = 0;
		for (int i = 1; i <= len; i++) {
			sum += ((i - last[ch[i - 1]]) * (len - i + 1));
			last[ch[i - 1]] = i;
		}
		System.out.println(sum);
	}
}

说明:此代码并未AC,未发现其漏洞,如有发现错误请告知,谢谢!

posted @   ChuenSan  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩