- Unique Substrings in Wraparound String@TOC
Consider the string s to be the infinite wraparound string of “abcdefghijklmnopqrstuvwxyz”, so s will look like this: “…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…”.
Now we have another string p. Your job is to find out how many unique non-empty substrings of p are present in s. In particular, your input is the string p and you need to output the number of different non-empty substrings of p in the string s.
Note: p consists of only lowercase English letters and the size of p might be over 10000.
Example 1:
Input: “a”
Output: 1
Explanation: Only the substring “a” of string “a” is in the string s.
Example 2:
Input: “cac”
Output: 2
Explanation: There are two substrings “a”, “c” of string “cac” in the string s.
Example 3:
Input: “zab”
Output: 6
Explanation: There are six substrings “z”, “a”, “b”, “za”, “ab”, “zab” of string “zab” in the string s.
最开始我用的是set 截取每一段的子串然后最后算size,这样复杂度太高,
现在的方法是DP
abcd 其实就是 abcd bcd cd d有四种子串,如果出现abcddef 没关系,def ef f就可以存储
如果出现abcdbcd 由于是重复的,所以要每次在数组中取最大的值
**class Solution {
public:
int findSubstringInWraproundString(string p) {
vector<int> vec(26,0);
int maxLenCur = 0;
for(int i=0;i<p.length();i++){
if(i>0 && ((p[i]-p[i-1]==1) || (p[i-1]-p[i]==25))){
maxLenCur++;
}
else
maxLenCur = 1;
int index = p[i] - 'a';
vec[index] = max(maxLenCur,vec[index]);
}
int res = 0;
for(auto num:vec){
res += num;
}
return res;
}
};**