For each character, track the maximum length of a valid substring ending with that character. The sum of these maximum lengths gives the number of unique substrings in the wraparound string.
classSolution {
public:int findSubstringInWraproundString(string s) {
vector<int> dp(26);
int len =0;
for (int i =0; i < s.size(); ++i) {
if (i >0&& (s[i]-s[i-1]+26)%26==1) len++;
else len =1;
dp[s[i]-'a'] = max(dp[s[i]-'a'], len);
}
int ans =0;
for (int x : dp) ans += x;
return ans;
}
};
classSolution {
publicintfindSubstringInWraproundString(String s) {
int[] dp =newint[26];
int len = 0;
for (int i = 0; i < s.length(); ++i) {
if (i > 0 && (s.charAt(i)-s.charAt(i-1)+26)%26 == 1) len++;
else len = 1;
dp[s.charAt(i)-'a']= Math.max(dp[s.charAt(i)-'a'], len);
}
int ans = 0;
for (int x : dp) ans += x;
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
funfindSubstringInWraproundString(s: String): Int {
val dp = IntArray(26)
var len = 0for (i in s.indices) {
if (i > 0&& (s[i]-s[i-1]+26)%26==1) len++else len = 1 dp[s[i]-'a'] = maxOf(dp[s[i]-'a'], len)
}
return dp.sum()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution:
deffindSubstringInWraproundString(self, s: str) -> int:
dp = [0] *26 l =0for i, c in enumerate(s):
if i >0and (ord(c) - ord(s[i-1]) +26) %26==1:
l +=1else:
l =1 idx = ord(c) - ord('a')
dp[idx] = max(dp[idx], l)
return sum(dp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
impl Solution {
pubfnfind_substring_in_wrapround_string(s: String) -> i32 {
letmut dp =vec![0; 26];
letmut len =0;
let s = s.as_bytes();
for i in0..s.len() {
if i >0&& (s[i] +26- s[i-1]) %26==1 {
len +=1;
} else {
len =1;
}
let idx = (s[i] -b'a') asusize;
dp[idx] = dp[idx].max(len);
}
dp.iter().sum()
}
}