LeetCode 828. 统计子串中的唯一字符(中心扩展)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 828. 统计子串中的唯一字符(中心扩展)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
我們定義了一個函數 countUniqueChars(s) 來統計字符串 s 中的唯一字符,并返回唯一字符的個數。
例如:s = “LEETCODE” ,則其中 “L”, “T”,“C”,“O”,“D” 都是唯一字符,因為它們只出現一次,所以 countUniqueChars(s) = 5 。
本題將會給你一個字符串 s ,我們需要返回 countUniqueChars(t) 的總和,其中 t 是 s 的子字符串。
注意,某些子字符串可能是重復的,但你統計時也必須算上這些重復的子字符串(也就是說,你必須統計 s 的所有子字符串中的唯一字符)。
由于答案可能非常大,請將結果 mod 10 ^ 9 + 7 后再返回。
示例 1: 輸入: "ABC" 輸出: 10 解釋: 所有可能的子串為:"A","B","C","AB","BC" 和 "ABC"。其中,每一個子串都由獨特字符構成。所以其長度總和為:1 + 1 + 1 + 2 + 2 + 3 = 10示例 2: 輸入: "ABA" 輸出: 8 解釋: 除了 countUniqueChars("ABA") = 1 之外,其余與示例 1 相同。示例 3: 輸入:s = "LEETCODE" 輸出:92提示: 0 <= s.length <= 10^4 s 只包含大寫英文字符來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-unique-characters-of-all-substrings-of-a-given-string
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
類似題目:LeetCode 1180. 統計只含單一字母的子串
- 對每個字符進行考慮,找到每個字符前后同樣的字符的位置
- 左右兩邊的數量相乘即為,該字符可以出現在子串的次數
64 ms 7.2 MB
另一種方法,預先存儲下來相同字符的位置
class Solution { public:int uniqueLetterString(string s) {int count = 0;unordered_map<char,set<int>> m;for(int i = 0; i < s.size(); ++i){m[s[i]].insert(i);}int lenl, lenr;for(int i = 0; i < s.size(); ++i){auto it = m[s[i]].find(i);if(it == m[s[i]].begin())lenl = i+1;else{auto itl = it;itl--;lenl = i-*(itl);}if(it == --m[s[i]].end())lenr = s.size()-i;else{it++;lenr = *(it)-i;}count = (count+lenl*lenr)%1000000007;}return count;} };276 ms 21.9 MB
python3 解答
class Solution:def uniqueLetterString(self, s: str) -> int:count = 0for j in range(len(s)):i = j-1 k = j+1while i>=0 and s[i]!=s[j]:i -= 1while k<len(s) and s[j]!=s[k]:k += 1count = (count+(j-i)*(k-j))%1000000007return count804 ms 13.7 MB
總結
以上是生活随笔為你收集整理的LeetCode 828. 统计子串中的唯一字符(中心扩展)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 716. 最大栈(双栈
- 下一篇: LeetCode MySQL 1280.