廣告文化網(wǎng)站建設(shè)2023新聞大事件摘抄
我們定義了一個函數(shù)?countUniqueChars(s)
?來統(tǒng)計(jì)字符串?s
?中的唯一字符,并返回唯一字符的個數(shù)。
例如:s = "LEETCODE"
?,則其中?"L"
,?"T"
,"C"
,"O"
,"D"
?都是唯一字符,因?yàn)樗鼈冎怀霈F(xiàn)一次,所以?countUniqueChars(s) = 5
?。
本題將會給你一個字符串?s
?,我們需要返回?countUniqueChars(t)
?的總和,其中?t
?是?s
?的子字符串。輸入用例保證返回值為?32 位整數(shù)。
注意,某些子字符串可能是重復(fù)的,但你統(tǒng)計(jì)時也必須算上這些重復(fù)的子字符串(也就是說,你必須統(tǒng)計(jì)?s
?的所有子字符串中的唯一字符)。
1 <= s.length <= 105
s
?只包含大寫英文字符
需要統(tǒng)計(jì)所有子串中唯一字符次數(shù)的總和,可以換個角度統(tǒng)計(jì)每個字符在不同子串中出現(xiàn)的次數(shù)。
假設(shè)當(dāng)前字符為s[i],s[i]出現(xiàn)的子串只能出現(xiàn)一次s[i],如果出現(xiàn)兩次那么s[i]就不計(jì)算。所以如果想要計(jì)算s[i]對結(jié)果的貢獻(xiàn),需要找出左邊第一次出現(xiàn)s[i]的地方L,和右邊第一次出現(xiàn)s[i]的地方R。
所以只包含一次s[i]的字符串 左邊界必須大于等于L+1,右邊界必須小于等于R-1,左邊界可以取L+1~i ,右邊界可以取i到R-1,所以一共有(i-L)*(R-i-2)種情況。
因?yàn)槎际谴髮懽帜?#xff0c;可以使用L(i),R(i)數(shù)組表示i左邊第一次出現(xiàn)s[i]的下標(biāo),i右邊第一次出現(xiàn)s[i]的下標(biāo)。
可以在遍歷時使用一個大小為26的數(shù)組維護(hù)所有字母最后一次出現(xiàn)的下標(biāo),然后更新L(i)和R(i)。
class Solution {
public:int uniqueLetterString(string s) {int n = s.size();vector<int>l(n),r(n);vector<int>p(26,-1);for(int i=0;i<n;i++){l[i]=p[s[i]-'A'];p[s[i]-'A']=i;}p=vector<int>(26,n);for(int i=n-1;i>=0;i--){r[i]=p[s[i]-'A'];p[s[i]-'A']=i;}int res=0,MOD=1e9+7;for(int i=0;i<n;i++){res = (res+(long long)(i-l[i])*(r[i]-i))%MOD;}return res;}
};