467. Unique Substrings in Wraparound String
题目的意思是给一个无限循环的大字符串s,然后给一个小串p,求出p的子串在s中的个数;
首先可以将其分为26个状态,每一个小写字母是一个状态。循环遍历字符串,判断其是否是s的子串。
在第一种解法中使用了dp去更新,但是漏掉了两个相邻字符相等时对状态的影响。所以报错。
修改为后面的解法,可避免此问题。
小结:应该自己学会使用不同的测试用例,去测试程序的鲁棒性。
class Solution {
public int findSubstringInWraproundString(String p) {
if(p.length()<=1)
return p.length();
int dp[]=new int[26];
dp[p.charAt(0)-'a']=1;
for(int i=1;i<p.length();i++){
int temp1=p.charAt(i)-'a';
int temp2=p.charAt(i-1)-'a';
if(temp1-temp2==1 || (p.charAt(i-1)=='z' && p.charAt(i)=='a'))
dp[temp1]=Math.max(dp[temp2]+1,dp[temp1]);
else
dp[temp1]=Math.max(dp[temp1],1);
}
int maxres=0;
for(int i=0;i<26;i++)
maxres+=dp[i];
return maxres;
}
}
class Solution {
public int findSubstringInWraproundString(String p) {
if(p.length()<=1)
return p.length();
int dp[]=new int[26];
dp[p.charAt(0)-'a']=1;
int maxlen=1;
for(int i=1;i<p.length();i++){
if(p.charAt(i)-p.charAt(i-1)==1 || (p.charAt(i)=='a' && p.charAt(i-1)=='z'))
maxlen++;
else
maxlen=1;
dp[p.charAt(i)-'a']=Math.max(dp[p.charAt(i)-'a'],maxlen);
}
int maxres=0;
for(int i=0;i<26;i++)
maxres+=dp[i];
return maxres;
}
}