原题链接:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/
思路是dp数组保存以26个字母为结尾的子字符串的最长长度,之后将所有数组累加起来即可。举个例子,对于zab就有dp[z]=1,dp[a]=2,dp[b]=3,dp[z]中是z,dp[a]中是a,za,dp[b]中是zab,ab,b,加起来为6就是正确答案,这里我们用map来作为dp数组。
map[key]=value,key就是26个字母,value就是表示以key为结尾的子字符串最长长度
状态转移
map[i]=max(map[i],count) count就是以i为结尾的子字符串的长度,使用max取最长的
代码:
int findSubstringInWraproundString(string p) {
int len=p.size();
if(len==0) return 0;
map<char,int> map;
int count=1;
map[p[0]]=count;
for(int i=1;i<len;i++){
if(p[i]-p[i-1]==1||p[i-1]=='z'&&p[i]=='a'){
count++;
}else{
count=1;
}
map[p[i]]=max(map[p[i]],count);
}
int sum=0;
for(auto iter=map.begin();iter!=map.end();iter++){
sum+=iter->second;
}
return sum;
}
如果题目中与26个字母都有关,把字母作为动态规划的索引是非常好的方式,并且需要找到好的状态转移!