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)
ifs = "LEETCODE"
then"L"
,"T"
,"C"
,"O"
,"D"
are the unique characters since they appear only once ins
, thereforecountUniqueChars(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 }