定义字符串 base 为一个 “abcdefghijklmnopqrstuvwxyz” 无限环绕的字符串,所以 base 看起来是这样的:
"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".
给你一个字符串 s ,请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。
看官方示例,明显能进行划分的状态查找方式就是:i 位置自身、i 位置自身+之前的子数组
dp[i] 可以分成两种情况考虑,
if 长度为1,1
if 长度大于1,&& s[i-1] 和 s[i] 是连接的,dp[i-1]
&& s[i-1] 和 s[i] 不连接,0
dp[i] = 两种情况的总和
class Solution {
public:
int findSubstringInWraproundString(string s) {
int n = s.size();
vector<int> dp(n, 1);
for(int i = 1; i < n; i++)
if((s[i] - s[i-1] == 1) || (s[i] == 'a' && s[i-1] == 'z'))
dp[i] += dp[i-1];
// 这里注意,需要再遍历一次,把上面落下的第一个数据算进来
int ret[26] = {0};
for(int i = 0; i < n; i++)
ret[s[i]-'a'] = max(ret[s[i]-'a'], dp[i]);
int sum = 0;
for(auto e: ret) sum += e;
return sum;
}
};
🥰如果本文对你有些帮助,欢迎👉 点赞 收藏 关注,你的支持是对作者大大莫大的鼓励!!(????) 若有差错恳请留言指正~~