Welcome to Subscribe On Youtube
2223. Sum of Scores of Built Strings
Description
You are building a string s of length n one character at a time, prepending each new character to the front of the string. The strings are labeled from 1 to n, where the string with length i is labeled si.
- For example, for
s = "abaca",s1 == "a",s2 == "ca",s3 == "aca", etc.
The score of si is the length of the longest common prefix between si and sn (Note that s == sn).
Given the final string s, return the sum of the score of every si.
Example 1:
Input: s = "babab" Output: 9 Explanation: For s1 == "b", the longest common prefix is "b" which has a score of 1. For s2 == "ab", there is no common prefix so the score is 0. For s3 == "bab", the longest common prefix is "bab" which has a score of 3. For s4 == "abab", there is no common prefix so the score is 0. For s5 == "babab", the longest common prefix is "babab" which has a score of 5. The sum of the scores is 1 + 0 + 3 + 0 + 5 = 9, so we return 9.
Example 2:
Input: s = "azbazbzaz" Output: 14 Explanation: For s2 == "az", the longest common prefix is "az" which has a score of 2. For s6 == "azbzaz", the longest common prefix is "azb" which has a score of 3. For s9 == "azbazbzaz", the longest common prefix is "azbazbzaz" which has a score of 9. For all other si, the score is 0. The sum of the scores is 2 + 3 + 9 = 14, so we return 14.
Constraints:
1 <= s.length <= 105sconsists of lowercase English letters.
Solutions
-
class Solution { public long sumScores(String s) { int n = s.length(); int[] z = new int[n]; for (int i = 1, l = 0, r = 0; i < n; ++i) { if (i <= r) { z[i] = Math.min(r - i + 1, z[i - l]); } while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) { ++z[i]; } if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } } long ans = n; for (int x : z) { ans += x; } return ans; } } -
class Solution { public: long long sumScores(string s) { int n = s.size(); vector<int> z(n); for (int i = 1, l = 0, r = 0; i < n; ++i) { if (i <= r) { z[i] = min(r - i + 1, z[i - l]); } while (i + z[i] < n && s[z[i]] == s[i + z[i]]) { ++z[i]; } if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } } return n + accumulate(z.begin(), z.end(), 0LL); } }; -
class Solution: def sumScores(self, s: str) -> int: n = len(s) z = [0] * n l = r = 0 for i in range(1, n): if i <= r: z[i] = min(r - i + 1, z[i - l]) while i + z[i] < n and s[z[i]] == s[i + z[i]]: z[i] += 1 if i + z[i] - 1 > r: l, r = i, i + z[i] - 1 return n + sum(z) -
func sumScores(s string) int64 { n := len(s) z := make([]int, n) for i, l, r := 1, 0, 0; i < n; i++ { if i <= r { z[i] = min(r-i+1, z[i-l]) } for i+z[i] < n && s[z[i]] == s[i+z[i]] { z[i]++ } if i+z[i]-1 > r { l, r = i, i+z[i]-1 } } ans := int64(n) for _, x := range z { ans += int64(x) } return ans }