单独提出这道题的原因,没有想到这种状态…
dp[i]表示,表示以’a’、‘b’…‘z’,结尾的、最长的、子串长度。最终的答案= ∑ a z d p [ c h a r ] \sum_{a}^{z}dp[char] ∑azdp[char],就是所有字母结尾的最长子串的长度求累加和。
由于最后是累加,所以前面的所有可能情况都会考虑进来,不会漏掉,也不会多算,十分巧妙。
class Solution {
public int findSubstringInWraproundString(String p) {
// s中唯一的p的非空子串数量
// 子串!=子序列,必须要连续
int n = p.length();
int[] dp = new int[26];
int k = 0;
for (int i = 0; i < n; i++) {
if (i > 0 && (p.charAt(i) == p.charAt(i - 1) + 1 || p.charAt(i - 1) - p.charAt(i) == 25)) {
k++;
} else {
k = 1;
}
int idx = p.charAt(i) - 'a';
dp[idx] = Math.max(dp[idx], k);
}
int ans = 0;
for (int i = 0; i < 26; i++) {
ans += dp[i];
}
return ans;
}
}