467. 环绕字符串中唯一的子字符串
思路:
记录分别以 26 的小写英文字母结尾(开头也是一样的)的最长子串的长度。
即:
…a (x0)
…b (x1)
…c (x2)
。。。。。
…z (x25)
那么答案就是 x0+x1+x2+…+x25.
这就可以做到不重不漏。
或者换个说法:
用布尔值
f
[
c
]
[
l
e
n
]
f[c][len]
f[c][len]表示以字符c开始的合法的len个字符是否在串p中出现,
那么总的状态数就是
26
∗
l
e
n
(
p
)
26 * len(p)
26∗len(p),是有限的。
class Solution {
public:
bool isContinous(char prev, char curr) {
if (prev == 'z') return curr == 'a';
return prev + 1 == curr;
}
int findSubstringInWraproundString(string p) {
vector<int> dp(26, 0);
int N = p.size();
int k = 0;
for (int i = 0; i < N; ++i) {
if (i > 0 && isContinous(p[i - 1], p[i])) {
++k;
} else {
k = 1;
}
dp[p[i] - 'a'] = max(dp[p[i] - 'a'], k);
}
return accumulate(dp.begin(), dp.end(), 0);
}
};