LeetCode 467. 环绕字符串中唯一的子字符串

思路

记录每个字母为开头的最大长度,根据这个长度更新之后的字符数量,最后全部相加。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
int findSubstringInWraproundString(string p) {
vector<int> dp(26);
int subSL=1;
char startS=p[0]-'a';
for(int i=0;i+1<p.length();i++){
char c1=p[i]-'a';
char c2=p[i+1]-'a';
if((c1+1)%26==c2){
subSL++;
}else{
dp[startS]=max(dp[startS],subSL);
subSL=1;
startS=c2;
}
}
dp[startS]=max(dp[startS],subSL);
for(int i=0;i<26;i++){
if(dp[i]){
for(int k=1;k<dp[i];k++){
dp[(i+k)%26]=max(dp[(i+k)%26],dp[i]-k);
}
}
}
int res=0;
for(int i=0;i<26;i++){
res+=dp[i];
}
return res;
}
};

[^1]: