LeetCode 467. 环绕字符串中唯一的子字符串

467. 环绕字符串中唯一的子字符串

 

【线性DP+滑动窗口】首先要用滑动窗口来确定出一段符合要求的连续空间,然后计算这些空间中组成的子字符串的个数,但是计算子字符串的过程中会出现大量的重复,例如:abcde和cdef这两个很明显cde组成的子串会被计算很多次,因此需要转换一下思路。

定义dp[c]为以c字符结尾的连续子串的最大长度,这样这个长度就是c对答案的贡献,举个🌰:

abcdxab

对于a:dp[a]=1

ab:dp[b] = 2 这里的2相当于b的加入使得答案增加了b和ab这两个子串

abc:dp[c]=3 加入了c bc abc三个

abcd:dp[c]=4

x:此时x不是连续了,但是它也能贡献x这样一个子串 dp[x]=1

a:dp[a] = max(dap[a], 1) = 1

ab:dp[b] = max(dp[b],2) = 2  这里的max和之前比较久很好地达到了去重的目的

class Solution {
    public int findSubstringInWraproundString(String p) {
        // 10:31.    16min
        // a 1
        // ab 2
        // abc 3
        // abcd 4
        int i = 0, j = 1, n = p.length();
        if(n == 1) return 1;
        int[] cnt = new int[26];
        cnt[p.charAt(0) - 'a'] = 1;
        while(j < n){
            if(p.charAt(j) - p.charAt(j - 1) == 1 || (p.charAt(j - 1) == 'z' && p.charAt(j) == 'a'));
            else i = j;
            cnt[p.charAt(j) - 'a'] = Math.max(j - i + 1, cnt[p.charAt(j) - 'a']);
            j++;
        }
        int ans = 0;
        for(i = 0; i < 26; i++) ans += cnt[i];
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值