Question
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.
字符串S是一个无限的字符串,比如“…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd….”。现在我们有另一个字符串p,你的任务是找出P在S中有多少种不重复的非空子字符串。(P仅由小写英文字母组成,p不超过10000)
Example
Input: “a”
Output: 1
Explanation: Only the substring “a” of string “a” is in the string s.
Input: “cac”
Output: 2
Explanation: There are two substrings “a”, “c” of string “cac” in the string s.
Input: “zab”
Output: 6
Explanation: There are six substrings “z”, “a”, “b”, “za”, “ab”, “zab” of string “zab” in the string s.
Solution
动态规划解。这里其实主要要考虑如何计算不会重复,其实我们只需计算以不同字母结尾的最长子串,最后全部相加起来即可,比如输入是“zab”,以z结尾的最长子串为1,以a结尾的最长子串为2,以b结尾的最长子串为3,然后1 + 2 + 3 = 6即可。
class Solution(object): def findSubstringInWraproundString(self, p): """ :type p: str :rtype: int """ pattern = {} for i in range(26): pattern[chr(97 + i)] = 0 len_continue_str = 1 for index_p, value in enumerate(p): # 如果和前面相连,则更新最长字串长度 if ord(value) - ord(p[index_p - 1]) == 1 or ord(p[index_p - 1]) - ord(value) == 25: len_continue_str += 1 # 如果不相连则重置 else: len_continue_str = 1 pattern[p[index_p]] = max(pattern[p[index_p]], len_continue_str) # 全部加起来 result = 0 for value in pattern.values(): result += value return result