环绕字符串中的唯一子字符串-动态规划
环绕字符串中的唯一子字符串-动态规划
Solution
这题的状态定义比较特别,虽然依赖于位置,但是要寻找最大的并且去重,就需要根据26个字符来定义状态了。
注意更新条件,要寻找最长的,所以比原来更长才更新。
#include<iostream>
#include<vector>
using namespace std;//状态定义dp(i)表示s中以字符i结尾的子串在base字符串中能延伸的最大长度
//但是这里其实不能算严格意义上的状态,真正的状态还是依赖于字符的位置,
//当前位置的状态只依赖于前一个的,所以只用一个变量就行了
int findSubstringInWraproundString(string s) {int n = s.length();int ans = 0;vector<int>dp(27, 0);dp[s[0]-'a'] = 1;int len = 1;//用来记录当前已经延伸的最大长度,动态更新for (int i = 1; i < n; ++i) {int c = s[i] - 'a';int lc = s[i - 1] - 'a';//可以延伸的情况if (c - lc == 1 || c == 0 && lc == 25) {len++;//注意更新条件,寻找的是最大的,所以比原来更优才替换dp[c] = max(dp[c], len);}//无法延伸的情况else {len = 1;//注意更新条件,寻找的是最大的,所以比原来更优才替换dp[c] = max(dp[c], len);}}for (int x : dp) {ans += x;}return ans;
}
int main() {return 0;
}