https://leetcode.com/problems/unique-substrings-in-wraparound-string/
Consider the string
s
to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz", sos
will look like this: "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".Now we have another string
p
. Your job is to find out how many unique non-empty substrings ofp
are present ins
. In particular, your input is the stringp
and you need to output the number of different non-empty substrings ofp
in the strings
.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.
螺旋递增,单递推式dp,针对每个值记忆
class Solution {
public:
int findSubstringInWraproundString(string p) {
if(p.size() == 0) return 0;
long long result = 1;
int len = 1;
vector<int> used(26, 0);
used[p[0]-'a'] = 1;
for(int i = 1; i < p.size(); ++i){
if(valid(p[i-1], p[i])) ++len;
else len = 1;
result += max(0, len-used[p[i]-'a']);
used[p[i]-'a'] = max(used[p[i]-'a'], len);
}
return result;
}
bool valid(char ch1, char ch2){
if(ch1 == 'z' && ch2 == 'a') return true;
else if(ch2-ch1 == 1) return true;
else return false;
}
};