解题思路:dp[i]表示以第i个字母结尾的最长的子字符串的长度。那么字符串P的不同子字符串的数量为dp[0] + dp[1] + … + dp[25] (从a一直加到z)。循环P中的每一个字符,不断更新该字符所能达到的最长字符串长度。具体的c++代码如下:
class Solution {
public:
int findSubstringInWraproundString(string p) {
int length = p.size(); //计算字符串P的长度
if(length==0)
return 0; //如果字符串P的长度为0,则返回0
vector<int> dp(26,0); //用于存放以每个字母结尾所能形成的最长字符串
dp[p[0]-'a'] = 1; //计算P中第一个字符的位置和第一个字符所能形成的最长长度
int dpi = 1; //用于更新字符串长度的变量
for(int i=1;i<length;i++)
{
if(p[i]-p[i-1]==1 || p[i-1]-p[i]==25) //有两种情况,分别是ab或者是za,所以有两种判断条件
dpi++; //符合条件的话让dpi++
else
dpi = 1; //不符合条件让dpi重新开始计算
dp[p[i]-'a'] = max(dp[p[i]-'a'],dpi); //找到对应的字符对应的位置,把对应的最长长度放进去
}
int num = 0;
for(int i=0;i<26;i++)
{
num = num + dp[i]; //计算所有的字母的最长长度之和
}
return num;
}
};