Files
leetcode-master/problems/kamacoder/0150.极长连续段的权值.md
programmercarl d1be6070c2 Update
2024-08-01 10:25:20 +08:00

1.4 KiB
Raw Blame History

150. 极长连续段的权值

动态规划,枚举最后边节点的情况:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;

    long long result = 1;
    long long a = 1;

    for (int i = 1; i < n; ++i) {
        // 加上本身长度为1的子串 
        if (s[i] == s[i - 1]) {
            a += 1;
            result += a; 
        // 以最右节点为终点,每个子串的级长连续段都+1再加本身长度为1的子串
        } else {
            a = a + i + 1;
            result += a;
        }
    }
    cout << result << endl;
    return 0;
} 

Java代码如下

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String s = scanner.next();

        long result = 1;
        long a = 1;

        for (int i = 1; i < n; ++i) {
            // 加上本身长度为1的子串
            if (s.charAt(i) == s.charAt(i - 1)) {
                a += 1;
                result += a;
            // 以最右节点为终点,每个子串的级长连续段都+1再加本身长度为1的子串
            } else {
                a = a + i + 1;
                result += a;
            }
        }

        System.out.println(result);
    }
}