算法前缀和之abb

package com.zhang.reflection.面试.算法模版.前缀和;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心”
 * leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列?
 * 定义: abb 型字符串满足以下条件:  (子序列不要求连续,子串要求连续)
 *
 * 字符串长度为 3 。
 * 字符串后两位相同。
 * 字符串前两位不同。
 */
public class abb {
    /**
     * 可以说是前序和感觉
     * 先计算当前往前有多少个不同组合,直到遇到下一个相同字符再累加进去
     * abcbcc
     * 就以c来说
     * 第一次c前面有ab组合两种,dp['c'-'a'] = 0;
     * 第二个c前面有abcb有三种abb三种组合 dp['c'-'a'] = 2
     * 第三个c的时候可以和第一个组合,有两种,第二组合有三种,dp['c'-'a'] = 5
     * 第一次 0种符合的组合,第二次有2种符合的组合,第三次有5种符合的组合
     * 关键要先计数,下次遇到相同的字符再累加
     * @param
     * @return
     * @author louss
     * @date 2022/4/10 17:32
     */
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String str = br.readLine();
        long[] sum = new long[26];
        long[] dp = new long[26];
        long result = 0;
        for(int i=0;i<n;i++){
            int index = str.charAt(i)-'a';
            result += dp[index];
            dp[index] += i - sum[index];
            sum[index]++;
        }
        System.out.println(result);
    }
}

全部评论

相关推荐

06-26 18:30
门头沟学院 Java
据说名字越长别人越关注你的昵称我觉得我要被关注了:你问问这里面有多少是正经候选人,而不是乱打招呼的
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务