1. 解析
题目大意, 在由无限多个"abcdefghijklmnopqrstuvwxyz"子串组成的字符串s中,在字符串p中查找s的子串。
2. 分析
我们最容易想到的解法无非是用暴力求解,先划分子序列,然后根据划分的子序列再具体划分,但这种方法的时间复杂度为。参考@Grandyang的博客,实际上这题本身是一道模拟题,不过这个规律确实难找了一点。
例如. 以d结尾的字符串分别为:"abcd"、"bcd"、"cd"、"d",我们会发现"abcd"字符串包含其它3个子序列,即以某个字母结尾的最长字符串会包含其它长度较短的同样以该字母结尾的字符串。如果要求"abcd"所有的在s当中的子串,相当于求解分别以"a"、"b"、"c"、"d"结尾的字符串长度的总和,为什么是这样,不妨自己写几个例子,推导一下就看出来了。但我觉得这种规律一般是想不出来的~~~
class Solution {
public:
int findSubstringInWraproundString(string p){
int len = 0;
vector<int> nums(26, 0);
for (int i = 0; i < p.length(); ++i){
if ( (i == 0) || (p[i] == 'a' && p[i-1] == 'z') || (p[i] - p[i-1] == 1)) //在p中划分s的子串
len++;
else
len = 1;
nums[p[i]-'a'] = max(nums[p[i]-'a'], len);
}
return accumulate(nums.begin(), nums.end(), 0);
}
};