蓝桥杯 PREV-229 子串分值和【第十一届】【省赛】Python50 Java60

题目链接:

“蓝桥杯”练习系统icon-default.png?t=M276http://lx.lanqiao.cn/problem.page?gpid=T2858蓝桥杯 PREV-229 子串分值和【第十一届】【省赛】Python50 Java60_第1张图片

蓝桥杯 PREV-229 子串分值和【第十一届】【省赛】Python50 Java60_第2张图片

【分析】emmm,目前只能想出这个方法来拿部分分了,如果有大佬做全对了欢迎指教一下小弟。

二重循环遍历字符串,用一个字典来记录前面出现过的字符,另一个字典记录是否将重复出现的字符去掉,先把i加入字典并设置t为1,j从i+1开始遍历后面的字符,如果当前字符出现过并且没有去重,就把t--,否则t大小不变。如果没有出现过,就把t++。将t的个数累加起来。

st = input()
n = len(st)
ans = 0
for i in range(n):
    tab = {}
    tr = {}
    tab[st[i]] = 1
    t = 1
    ans += t
    #print(st[i], t)
    for j in range(i + 1, n):
        c = st[j]
        if c in tab and c not in tr:
            t -= 1
            tr[c] = 1
            if t < 0:
                t = 0
        elif c not in tab:
            t += 1
            tab[c] = 1
        #print(c, t)
        ans += t
print(ans)

【Java版】

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

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        int n = str.length();
        int i, j, t = 0, ans = 0;
        char c;
        for(i = 0; i < n; i++){
            HashSet set = new HashSet<>();
            HashSet se = new HashSet<>();
            set.add(str.charAt(i));
            t = 1;
            ans += t;
            for(j = i + 1; j < n; j++){
                c = str.charAt(j);
                if(set.contains(c)){
                    if(!se.contains(c)){
                        t--;
                        se.add(c);
                    }
                }else{
                    t++;
                    set.add(c);
                }
                ans += t;
            }
        }
        System.out.println(ans);
    }
}

 

 

 

你可能感兴趣的:(蓝桥杯,蓝桥杯)