【c++】 LeetCode 467. Unique Substrings in Wraparound String

    xiaoxiao2021-03-25  108

    题目:

    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.

    思路解析:

    本题中s是由abcd....zab.....组成,可扩展为无线个。而需找出P中子串同时也是S中子串的个数,且不能重复。 列如p="abcabc",则只有a,b,c,ab,bc,abc共6个 故以特定字符结尾的多个子串,只需考虑连续个数最大的子串。例如P中有def,cdef,abcdef三个,则只需考虑最后一个,前两种组合情况自然包含其中。 采用DP算法,申请一个数组,记录以每个字符结尾的最大子串数目,然后累加即可。

    解答:

    class Solution { public: int findSubstringInWraproundString(string p) { if(p.empty())return 0; vector<int> alph(26,0); int count=1; alph[p[0]-'a']=1; for(int i=1;i<p.size();i++) { if(p[i]-p[i-1]==1||p[i]-p[i-1]==-25) count++; else count=1; alph[p[i]-'a']=alph[p[i]-'a']>count?alph[p[i]-'a']:count; } int res=0; for(auto num:alph) res+=num; return res; } };
    转载请注明原文地址: https://ju.6miu.com/read-13407.html

    最新回复(0)