部分文字列スコアの合計

テストの質問H:部分文字列スコアの合計

【問題の説明】

文字列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])の合計を計算してください。

【入力フォーマット】

小文字のSで構成される文字列を含む行を入力します

[出力フォーマット]

答えを示す整数を出力します。

【サンプル入力】

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 

アイデア:

各部分文字列のスコアについては、最初に表示される文字のみが部分文字列に寄与します。たとえば、部分文字列「ababc」は文字abcに寄与します。次に、配列last [i]が文字iが最後に出現した位置を表すとすると、文字s [i]が寄与した部分文字列は、[last [i] + 1、i]と[i、n]で構成される部分文字列です。 ]、合計(i-last [i])*(n-i + 1)。

import java.util.*;
public class Main {
        public static void main(String[] args) {
            Scanner cin = new Scanner(System.in);
            String str =cin.next();
            int[] a = new int[30];
            
            long ans = 0;
            int n = str.length();
            str = " " + str;
            for(int i=1;i<=n;++i) {
                ans+=(i-a[str.charAt(i)-'a'])*(long)1*(n-i+1);
                a[str.charAt(i)-'a']=i;
            }
            System.out.println(ans);
        }
}

 

おすすめ

転載: blog.csdn.net/qq_44132777/article/details/114647026