696.计数二进制子串
虽然说是简单题,但我想不出来,这题答案的解法真的很巧妙。
class Solution {
public:
int countBinarySubstrings(string s) {
vector<int>counts(s.size(),0);
int count=1,ans=0;
for(int i=0;i<s.size();i++){
if(s[i+1]!='\0'&&s[i]==s[i+1]){
count++;
}
if(s[i]!=s[i+1]||s[i+1]=='\0'){
counts.push_back(count);
count=1;
}
}
for(int i=0;i<counts.size()-1;i++){
ans+=min(counts[i],counts[i+1]);
}
return ans;
}
};
467.环绕字符串中唯一的子字符串
这题我做不来,居然是动态规划,没想到。
class Solution {
public:
int findSubstringInWraproundString(string p) {
vector<int>dp(26,0);
int k=1;
dp[p[0]-'a']=1;
for(int i=1;i<p.size();i++){
if((p[i]-p[i-1]+26)%26==1){
k++;
k代表p每个中字母连续的串的长度。
}
else k=1;
dp[p[i]-'a']=max(dp[p[i]-'a'],k);
如果有重复的连续字母的子串,取较长的那个。
}
return accumulate(dp.begin(),dp.end(),0);
}
};