467. 环绕字符串中唯一的子字符串
题目:把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....". 现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。
解法:动态规划
思路:数学符号:dp[i]表示p中以字母i结尾的最大连续数;状态转移方程:遍历p的字母,没遇到一个字母p.charAt(i),就计算以它结尾的最大连续数,即 dp[(int)(p.charAt(i)-'a')] = Math.max(dp[(int)(p.charAt(i)-'a')],count);
代码:
class Solution {
public int findSubstringInWraproundString(String p) {
int len = p.length();
if(len0||len1){
return len;
}
int[] dp = new int[26]; //dp[i]表示p中以字母i结尾的最大连续数,存最大可以去重复
dp[(int)(p.charAt(0)-'a')] = 1;
for(int i = 1;i<len;i++){
int count = 1;
int j = i;
while(j>0&&(p.charAt(j-1)+1p.charAt(j)||p.charAt(j-1)'z'&&p.charAt(j)=='a')){ //计算连续字母个数,即是以字母i结尾的子串数
count++;
j--;
}
dp[(int)(p.charAt(i)-'a')] = Math.max(dp[(int)(p.charAt(i)-'a')],count);
}
int res = 0;
for(int i=0;i<26;i++){
res += dp[i];
}
return res;
}
}

浙公网安备 33010602011771号