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

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

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这道题目的关键在于理解题目中的环绕字符串的概念,即字符串是由"a"到"z"连续的子串组成的,而且在"z"之后是"a"。我们可以将这个问题转化为求解字符串中以每个字符(‘a’到’z’)结尾的最长连续子串的长度。

解题方法

我们可以使用动态规划的方法来解决这个问题。我们创建一个数组dp,其中dp[i]表示以字符i为结尾的最长连续子串的长度。然后我们遍历输入的字符串,对于每个字符,我们更新dp数组。如果当前字符和前一个字符是连续的,那么dp[i]就是dp[i-1]+1,否则dp[i]就是1。最后,我们将dp数组中的所有元素相加,就得到了结果。

复杂度

时间复杂度:

O ( n ) O(n) O(n),其中n是字符串的长度。我们需要遍历一次字符串。

空间复杂度:

O ( 1 ) O(1) O(1),我们只需要一个固定大小的数组。

Code

class Solution {
    public int findSubstringInWraproundString(String p) {
        int[] count = new int[26];
        int maxLengthCur = 0;
        for (int i = 0; i < p.length(); i++) {
            if (i > 0 && (p.charAt(i) - p.charAt(i - 1) == 1 || p.charAt(i - 1) - p.charAt(i) == 25)) {
                maxLengthCur++;
            } else {
                maxLengthCur = 1;
            }
            int index = p.charAt(i) - 'a';
            count[index] = Math.max(count[index], maxLengthCur);
        }
        int sum = 0;
        for (int i = 0; i < 26; i++) {
            sum += count[i];
        }
        return sum;
    }
}

这段代码首先初始化了一个长度为26的数组,用于存储以每个字符为结尾的最长连续子串的长度。然后遍历输入的字符串,对于每个字符,更新数组中对应的元素。最后,将数组中的所有元素相加,得到结果。

你可能感兴趣的:(算法,动态规划)