如果乙個字元在字串 s 中有且僅有出現一次,那麼我們稱其為獨特字元。
例如,在字串 s = 「letter」 中,「l」 和 「r」 可以被稱為獨特字元。
我們再定義 uniq(s) 作為字串 s 中獨特字元的個數。
那麼,在 s = 「letter」 中, uniq(「letter」) = 2。
對於給定字串 s,計算其所有非空子串的獨特字元的個數(即 uniq(substring))之和。
如果在 s 的不同位置上出現兩個甚至多個相同的子串,那麼我們認為這些子串是不同的。
考慮到答案可能會非常大,規定返回格式為:結果 mod 10 ^ 9 + 7。
示例 1:
輸入: "abc"
輸出: 10
解釋: 所有可能的子串為:"a","b","c","ab","bc" 和 "abc"。
其中,每乙個子串都由獨特字元構成。
所以其長度總和為:1 + 1 + 1 + 2 + 2 + 3 = 10
示例 2:
輸入: "aba"
輸出: 8
解釋: 除了子串 uniq('aba') = 1,其餘與示例1相同。
說明: 0 <= s.length <= 10000。
思 路分
析:\color思路分析:
思路分析
:對每乙個字元s[center],向前找到相同的字元s[before],向後找到相同的字元s[after]。當前字元對最終結果的貢獻是:(center - before)* (after - center)。
這相當於兩種方案的拼接:
在字串a(before ~ center)當中,字元s[center]貢獻的次數是(center - before)次。
在字串b(center ~ after)當中,字元s[center]貢獻的次數是 (after - center)。
那麼當兩者拼接的時候,字元 s[center] 對子串(before ~ after)的貢獻就是兩種方案的乘積。
class
solution
while
(after < strsize && s[after]
!= s[center]
) sum +
=(center - before)
*(after - center)
;//s[center] 對子串(before ~ after)的貢獻就是兩種方案的乘積
LeetCode 字串 反轉字串
反轉字串 編寫乙個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列char的形式給出。不要給另外的陣列分配額外的空間,你必須原地修改輸入陣列 使用 o 1 的額外空間解決這一問題。你可以假設陣列中的所有字元都是 ascii 碼表中的可列印字元。示例 1 輸入 h e l l o 輸出 o l ...
LeetCode 字串 親密字串
給定兩個由小寫字母構成的字串 a 和 b 只要我們可以通過交換 a 中的兩個字母得到與 b 相等的結果,就返回 true 否則返回 false 示例 輸入 a ab b ba 輸出 true 輸入 a ab b ab 輸出 false 輸入 a aa b aa 輸出 true 遍歷字串 a,記錄 a...
LeetCode 字串 重構字串
給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 輸入 s aab 輸出 aba 輸入 s aaab 輸出 說明 假設 s 中有多個 a,則我們想讓字串排成 axaxax 的形式。我們可以先統計每個字元出現的次數,然後利用間隔...