Welcome to Subscribe On Youtube

467. Unique Substrings in Wraparound String

Description

We define the string base to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz", so base will look like this:

  • "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".

Given a string s, return the number of unique non-empty substrings of s are present in base.

 

Example 1:

Input: s = "a"
Output: 1
Explanation: Only the substring "a" of s is in base.

Example 2:

Input: s = "cac"
Output: 2
Explanation: There are two substrings ("a", "c") of s in base.

Example 3:

Input: s = "zab"
Output: 6
Explanation: There are six substrings ("z", "a", "b", "za", "ab", and "zab") of s in base.

 

Constraints:

  • 1 <= s.length <= 105
  • s consists of lowercase English letters.

Solutions

  • class Solution {
        public int findSubstringInWraproundString(String p) {
            int[] dp = new int[26];
            int k = 0;
            for (int i = 0; i < p.length(); ++i) {
                char c = p.charAt(i);
                if (i > 0 && (c - p.charAt(i - 1) + 26) % 26 == 1) {
                    ++k;
                } else {
                    k = 1;
                }
                dp[c - 'a'] = Math.max(dp[c - 'a'], k);
            }
            int ans = 0;
            for (int v : dp) {
                ans += v;
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        int findSubstringInWraproundString(string p) {
            vector<int> dp(26);
            int k = 0;
            for (int i = 0; i < p.size(); ++i) {
                char c = p[i];
                if (i && (c - p[i - 1] + 26) % 26 == 1)
                    ++k;
                else
                    k = 1;
                dp[c - 'a'] = max(dp[c - 'a'], k);
            }
            int ans = 0;
            for (int& v : dp) ans += v;
            return ans;
        }
    };
    
  • class Solution:
        def findSubstringInWraproundString(self, p: str) -> int:
            dp = [0] * 26
            k = 0
            for i, c in enumerate(p):
                if i and (ord(c) - ord(p[i - 1])) % 26 == 1:
                    k += 1
                else:
                    k = 1
                idx = ord(c) - ord('a')
                dp[idx] = max(dp[idx], k)
            return sum(dp)
    
    
  • func findSubstringInWraproundString(p string) int {
    	dp := make([]int, 26)
    	k := 0
    	for i := range p {
    		c := p[i]
    		if i > 0 && (c-p[i-1]+26)%26 == 1 {
    			k++
    		} else {
    			k = 1
    		}
    		dp[c-'a'] = max(dp[c-'a'], k)
    	}
    	ans := 0
    	for _, v := range dp {
    		ans += v
    	}
    	return ans
    }
    
  • function findSubstringInWraproundString(p: string): number {
        const n = p.length;
        const dp = new Array(26).fill(0);
        let cur = 1;
        dp[p.charCodeAt(0) - 'a'.charCodeAt(0)] = 1;
        for (let i = 1; i < n; i++) {
            if ((p.charCodeAt(i) - p.charCodeAt(i - 1) + 25) % 26 == 0) {
                cur++;
            } else {
                cur = 1;
            }
            const index = p.charCodeAt(i) - 'a'.charCodeAt(0);
            dp[index] = Math.max(dp[index], cur);
        }
        return dp.reduce((r, v) => r + v);
    }
    
    
  • impl Solution {
        pub fn find_substring_in_wrapround_string(p: String) -> i32 {
            let n = p.len();
            let p = p.as_bytes();
            let mut dp = [0; 26];
            let mut cur = 1;
            dp[(p[0] - b'a') as usize] = 1;
            for i in 1..n {
                if (p[i] - p[i - 1] + 25) % 26 == 0 {
                    cur += 1;
                } else {
                    cur = 1;
                }
                let index = (p[i] - b'a') as usize;
                dp[index] = dp[index].max(cur);
            }
            dp.into_iter().sum()
        }
    }
    
    

All Problems

All Solutions