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 @ 2022-07-26 05:46  Dylan_Java_NYC  阅读(156)  评论(0编辑  收藏  举报