题目链接: https://leetcode.com/problems/unique-substrings-in-wraparound-string/description/
Description
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.
解题思路
整体思路为动态规划,先举几个例子来看看。
从最简单的例子开始,p = "acb"
。p
中没有长度超过 2 的子串是 s
的子串,只有单字符子串 "a", "c", "b"
,共 3 个。
稍微复杂一点点的,p = "abc"
。p
正好是 s
的子串,则 p
的任意子串都是 s
的子串,分别为 "a", "b", "ab", "c", "bc", "abc"
,可以看到 a
结尾的子串有 1 个,b
结尾的子串有 2 个,c
结尾的子串有 3 个。
再稍微复杂一点点的,p = "ababc"
。此时,p
不是 s
的子串,但是 p
中有一个子串 ab
是另一个子串 abc
的子串,存在包含关系,那么 p
中能匹配到 s
的非空子串数量由更长的子串 abc
决定。
总结上面这些例子,若 p
中有一个能匹配到 s
的长度为 t
的连续子串,则以子串中每个字符为结尾的子串个数分别为 1, 2, ..., t
,并且若有另一个包含该子串的更长的子串,则以更长的子串为主。
因此,算法的具体实现为先创建一个长度为 26 的数组用来记录每个字符为结尾的子串最多有多少个,最后将该数组每一项相加即为结果。
时间复杂度 O(n)
, 空间复杂度 O(1)
。
Code
class Solution {
public:
int findSubstringInWraproundString(string p) {
vector<int> alpha(26, 0);
int maxLen, res = 0;
for (int i = 0; i < p.size(); ++i) {
if (i > 0 && (p[i] - p[i - 1] == 1 || p[i - 1] - p[i] == 25))
maxLen++;
else
maxLen = 1;
alpha[p[i] - 'a'] = max(alpha[p[i] - 'a'], maxLen);
}
for (auto x: alpha) res += x;
return res;
}
};