LeetCode 828. Count Unique Characters of All Substrings of a Given String

原题链接在这里:https://leetcode.com/problems/count-unique-characters-of-all-substrings-of-a-given-string/

题目:

Let's define a function countUniqueChars(s) that returns the number of unique characters on s.

  • For example, calling countUniqueChars(s) if s = "LEETCODE" then "L""T""C""O""D" are the unique characters since they appear only once in s, therefore countUniqueChars(s) = 5.

Given a string s, return the sum of countUniqueChars(t) where t is a substring of s. The test cases are generated such that the answer fits in a 32-bit integer.

Notice that some substrings can be repeated so in this case you have to count the repeated ones too.

Example 1:

Input: s = "ABC"
Output: 10
Explanation: All possible substrings are: "A","B","C","AB","BC" and "ABC".
Every substring is composed with only unique letters.
Sum of lengths of all substring is 1 + 1 + 1 + 2 + 2 + 3 = 10

Example 2:

Input: s = "ABA"
Output: 8
Explanation: The same as example 1, except countUniqueChars("ABA") = 1.

Example 3:

Input: s = "LEETCODE"
Output: 92

Constraints:

  • 1 <= s.length <= 105
  • s consists of uppercase English letters only.

题解:

Instead of counting unique characters of all the substrings, we could for each character, how many substrings it could contribute as unique character.

XAXXAXXXX, for the first A, it could contribute to XA, A, AX, AXX, XAX, XAXX, 2 * 3 = 6. There are 2 choices before A and 3 choices after A.

Thus for each index, mark the last two occurance of its apparence.

Time Complexity: O(n). n = s.length().

Space: O(1).

AC Java:

复制代码
 1 class Solution {
 2     public int uniqueLetterString(String s) {
 3         int [][] last = new int[26][2];
 4         for(int i = 0; i < 26; i++){
 5             Arrays.fill(last[i], - 1);
 6         }
 7         
 8         int res = 0;
 9         for(int i = 0; i < s.length(); i++){
10             int ind = s.charAt(i) - 'A';
11             res += (i - last[ind][1]) * (last[ind][1] - last[ind][0]);
12             last[ind] = new int[]{last[ind][1], i};
13         }
14         
15         for(int i = 0; i < 26; i++){
16             res += (s.length() - last[i][1]) * (last[i][1] - last[i][0]);
17         }
18         
19         return res;
20     }
21 }
复制代码

类似Total Appeal of A String.

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