日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 828. 统计子串中的唯一字符(中心扩展)

發(fā)布時(shí)間:2024/7/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 828. 统计子串中的唯一字符(中心扩展) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 題目

我們定義了一個(gè)函數(shù) countUniqueChars(s) 來統(tǒng)計(jì)字符串 s 中的唯一字符,并返回唯一字符的個(gè)數(shù)。

例如:s = “LEETCODE” ,則其中 “L”, “T”,“C”,“O”,“D” 都是唯一字符,因?yàn)樗鼈冎怀霈F(xiàn)一次,所以 countUniqueChars(s) = 5 。

本題將會(huì)給你一個(gè)字符串 s ,我們需要返回 countUniqueChars(t) 的總和,其中 t 是 s 的子字符串。
注意,某些子字符串可能是重復(fù)的,但你統(tǒng)計(jì)時(shí)也必須算上這些重復(fù)的子字符串(也就是說,你必須統(tǒng)計(jì) s 的所有子字符串中的唯一字符)。

由于答案可能非常大,請將結(jié)果 mod 10 ^ 9 + 7 后再返回。

示例 1: 輸入: "ABC" 輸出: 10 解釋: 所有可能的子串為:"A","B","C","AB","BC""ABC"。其中,每一個(gè)子串都由獨(dú)特字符構(gòu)成。所以其長度總和為: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
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

類似題目:LeetCode 1180. 統(tǒng)計(jì)只含單一字母的子串

  • 對每個(gè)字符進(jìn)行考慮,找到每個(gè)字符前后同樣的字符的位置
  • 左右兩邊的數(shù)量相乘即為,該字符可以出現(xiàn)在子串的次數(shù)
class Solution { //C++ public:int uniqueLetterString(string s) {int i, j, k, count = 0;for(j = 0; j < s.size(); ++j){i = j-1, k = j+1;while(i>=0 && s[i] != s[j])i--;while(k<s.size() && s[j] != s[k])k++;count = (count+(j-i)*(k-j))%1000000007;}return count;} };

64 ms 7.2 MB

另一種方法,預(yù)先存儲(chǔ)下來相同字符的位置

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 count

804 ms 13.7 MB

總結(jié)

以上是生活随笔為你收集整理的LeetCode 828. 统计子串中的唯一字符(中心扩展)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。